[英]Best practice for communication between Server and background processes
我有一個Django網絡應用程序,其中公開了用於控制服務器的api。 在同一台服務器上,我有一個后台進程。 Web應用程序需要定期通知后台進程某些更改,以便該進程可以從數據庫刷新其信息。 現在,我已經設置好了,以便在啟動Django應用程序的wsgi腳本中的后台線程(使用multiprocessing.Process)中啟動后台進程。 這對於在開發過程中輕松啟動/停止所有操作非常方便。
我知道有一百種方法可以給這只貓皮做皮,但我正在尋找最優雅的貓。 我的直覺是,使用multiprocessing.Queue是將數據傳遞到后台進程的絕佳方法。 但是,我不知道隊列在Django應用程序中的位置。 我要在wsgi中實例化它嗎? 如果是這樣,我如何將其傳遞給應用程序? 還有其他應該創建它的地方,以便我可以在應用程序視圖中訪問它嗎?
我很好奇,是否有人曾經應對過這個挑戰。
解決了:
根據Aviah的建議,這是我將SocketServer與靜態類成員Queue結合使用的解決方案。 做工精美。
我在服務器上的主要啟動腳本:
if __name__ == "__main__":
scanner = Scanner(API.queue)
scanner.launch()
print("Launcing Socket Server...")
server = socketserver.TCPServer(('localhost', settings.PORT), API)
server.serve_forever()
API類:
class API(socketserver.BaseRequestHandler):
queue = Queue()
def handle(self):
data = pickle.loads(self.request.recv(RECEIVE_BUFFER_SIZE))
... bla bla ...
API.queue.put(settings.SIGNALS.update)
response = {Comm.response_label: Comm.response.ok}
self.request.sendall(pickle.dumps(response))
掃描器類:
class Scanner:
def __init__(self, signal_queue):
self.queue = signal_queue
def launch(self):
# Launch the worker thread
x = Process(target=self.scan)
x.start()
def scan(self):
print("FileScanner started...")
# Service Loop
while True:
try:
signal = self.queue.get(block=False)
print("Signal received.")
except queue.Empty:
pass
... bla bla ...
SocketServer是一個簡單,獨立的平台,可以運行python TCP服務器。 如果您擁有Python,那么您已經擁有了它,並且可以在本地的另一個線程上運行它。 工作量很大時,只需將其移至另一台機器上即可。 (它實際上用於django runserver)。 https://docs.python.org/2/library/socketserver.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.