簡體   English   中英

服務器與后台進程之間通信的最佳實踐

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM