龙卷风带有多处理,用于阻止呼叫



我有一个请求,其中我必须在龙卷风服务器中进行阻止调用,并且我不希望出于任何原因将主线程阻止。所以我认为我会在其他线程/过程中运行它。

存根代码是这样的:

import tornado.web
import tornado.gen
import time
from tornado.ioloop import IOLoop
## Run this function in different process
def blocking_get(var1):
    print("blocking function")
    time.sleep(2)
    return {"res":"some result"}
class rootHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    @tornado.gen.coroutine
    def get(self, *args, **kwargs):
        print("Get called for {}".format(self))
        var1 = self.get_argument('var1', None)
        ## ************************************
        ## get values from blocking call blocking_get()
        resp_dict = getRespFromDifferentProcess()
        self.write(resp_dict)
        self.finish()
    def _call_later_something(self):
        print("_call_later_something")

class TestApp(tornado.web.Application):
    def __init__(self, test=False):
        handlers = [
            (r"/", rootHandler),
        ]
        tornado_settings = dict(
            debug=True,
            serve_traceback=True,
        )
        tornado.web.Application.__init__(self, handlers, **tornado_settings)

if __name__ == "__main__":
    PORT = 8888
    print("Tornado on port {}".format(PORT))
    http_server = TestApp()
    http_server.listen(PORT)
    IOLoop.instance().start()
  1. 如果我以不同的线程运行,则python的gil会在执行阻止线程时阻止主线程?
  2. 使用多处理而不是多线程的优点是什么?
  3. 如果我必须在龙卷风中使用多处理方法?
  4. 如果我希望阻止代码从队列中获取值,请对其进行处理并在主线程中调用该函数,如何实现它。
  1. 是的,它将阻止主线程,但最大间隔为1000字节命令或15 ms(如果我没记错的话(。之后,解释器将在线程之间切换。但是解释器非常聪明,IO操作(和C-Lib调用(根本不会阻止,因此对于解释器,如果time.sleep(2)在单独的线程中运行,则意味着它将返回主线程约2秒钟,然后切换后退。IO也一样:如果您file.read()(或等待喜欢您的情况(从一个巨大的文件中等待,则仅在阅读完成后才切换到该线程。
  2. 这个问题已经回答。
  3. 在您的情况下,您不需要。例如,用执行程序将队列阅读移至另一个线程。那就是龙卷风工作的亚同步DB驱动程序。
  4. 参见3。

相关内容

  • 没有找到相关文章

最新更新