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