簡體   English   中英

龍卷風web http請求阻止其他請求,如何不阻止其他請求

[英]tornado web http request blocks other requests, how to not block other requests

import tornado.web
import Queue

QUEUE = Queue.Queue()

class HandlerA( tornado.web.RequestHandler ):
    def get(self):
        global QUEUE
        self.finish(QUEUE.get_nowait())

class HandlerB( tornado.web.RequestHandler ):
    def get(self):
        global QUEUE
        QUEUE.put('Hello')
        self.finish('In queue.')

問題: HandlerA阻止HandlerB 10秒鍾。

  1. 瀏覽器A由HandlerA處理並等待......
  2. 瀏覽器B由HandlerB處理並等待....直到超時異常

目標

  1. 瀏覽器A由HandlerA處理並等待......
  2. 瀏覽器B由HandlerB處理並返回
  3. HandlerA在出列后返回

這是非阻塞,異步,epoll或套接字的問題嗎?

謝謝!

更新:

我使用新線程更新了此代碼以處理Queue.get_nowait()請求。 我擔心這是一個可怕的解決方案,考慮到我將同時擁有數千個請求,因此會同時擁有數千個線程。 我正在考慮在不久的將來轉向epoll風格。

class HandlerA( tornado.web.RequestHandler ):
    @tornado.web.asynchronous
    def get(self):
       thread.start_new_thread(self.get_next)

    def get_next(self):
        global QUEUE
        self.finish(QUEUE.get_nowait())

現在這不是處理它的最好方法......但至少它是一個開始。

在這里找到在Tornado中運行阻止代碼

這是Python。 所以, time.sleep將始終阻止流程! 要使用Tornado在10秒后調用操作,您需要使用tornado.ioloop.add_timeout函數並將回調作為參數傳遞。 文檔了解更多信息

暫無
暫無

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

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