簡體   English   中英

Python燒錄服務器,如何發送另一個請求的線程?

[英]Python flask server, how to message a thread of another request?

我有一個python線程燒瓶Web服務器,它在收到的每個請求上執行昂貴的任務。 例如

1) CLIENT --> REQUEST1 --> SERVER
2) Server performing expensive task for request1...
3) CLIENT --> REQUEST2 --> SERVER
4) Server Performing expensive tasks for request1 and request2 in parallel...
5) Server sends complete response for request1 (or request2)
6) Server sends complete response for request2 (or request1)

我希望服務器在第二個請求到達時停止執行request1的任務。 這就是我希望服務器的行為方式:

1) CLIENT --> REQUEST1 --> SERVER
2) Server performing expensive tasks for request1...
3) CLIENT --> REQUEST2 --> SERVER
4) Server immediately sends (incomplete) response for request1
5) Server performing expensive tasks for request2...
6) Server sends complete response for request2 

如何在request2 worker中獲取對request1 worker的引用,以便向它發送一條停止消息? 是否有可能在燒瓶中實現這一點(或者如果需要,可以利用一些實用程序庫)?

這不是答案,但我無法在評論中清楚地解釋我的想法。

有一個不那么漂亮的解決方案。 假設您有代碼在請求到達服務器時執行。

def funcReq()

但你可以做的是創建一個新線程,然后執行funcReq() ,這樣你就有了一個變量,它保存了你感興趣的線程暫停。 您可以將它存儲在某個地方(Flask有一個全局對象,它傳遞給我認為的每個請求),所有請求都可以訪問它。 現在,您可以控制從Request 2執行Request 1的線程。

此解決方案的問題在於您最終創建並運行兩倍的線程。 這很難看。

我設法實現了我正在尋找的東西,使用來自線程庫的安德烈建議的隊列和事件。 該事件稱為“worker_stopped”,如果請求沒有worker,則設置該事件。 該隊列稱為worker_to_worker ad,用於將來自新工作者(Request2的工作者)的“停止”消息發送給舊工作者(request1的工作者)。

在每個請求開始時使用以下代碼進行同步

if (not worker_stopped.isSet()):
  print('ordering the current worker to stop')
  worker_to_worker.put('stop')
  print('waiting that current worker has stopped')
  worker_stopped.wait()
worker_stopped.clear()
perform_expensive_task()

並定期檢查worker_to_worker隊列中沒有消息

if (worker_to_worker.empty()):
    # continue...
else:
    print('I\'m consuming a message from the worker_to_worker queue')
    worker_to_worker.get()
    worker_to_worker.task_done()
    print('signaling that the worker stopped')
    worker_stopped.set()
    # break...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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