龙卷风和 concurrent.futures.Executor
Tornado and concurrent.futures.Executor
我正在学习异步和 Torando 并且正在努力。首先可以在 Tornado 中使用执行器 class 吗?
下面的示例我正在创建一个 websocket,当收到一条消息时,我想 运行 check() 作为后台的另一个进程。这是一个人为的例子,只是为了我的学习。 INSIDE 或 AFTER 均未打印。如果我们有这个执行器 class?
为什么我们需要像 Motor 这样的异步特定包
此外,在我见过的 Torando 的所有示例中,@gen.coroutine 总是在扩展 tornado.web.RequestHandler 的 classes 上完成,在我的示例中,我使用的是 tornado.websocket.WebSocketHandler 也可以在这个 class 中使用 @gen.coroutine 吗?
最后有人能推荐一本关于这个主题的书或深入教程吗?我买了 "Introduction to tornado",但它有点过时,因为它使用 tornado.gen.engine。
def check(msg):
time.sleep(10)
return msg
class SessionHandler(tornado.websocket.WebSocketHandler):
def open(self):
pass
def on_close(self):
pass
# not sure if i needed this decorator or not?
@tornado.web.asynchronous
def on_message(self,message):
print("INSIDE")
with concurrent.futures.ProcessPoolExecutor() as executor:
f=executor.submit(check,"a")
result = yield f
print("AFTER")
要使用yield
,您必须使用@tornado.gen.coroutine
(或@gen.engine
)。 @tornado.web.asynchronous
与 yield
的使用无关,通常仅用于基于回调的处理程序(@asynchronous
仅适用于常规处理程序,不适用于 websockets)。更改装饰器,您应该会看到打印语句 运行.
为什么有人会写一个像 Motor 这样的异步库而不是使用这样的执行器?为了表现。一个线程或进程池比异步地做同样的事情要昂贵得多(主要是在内存方面)。当你需要一个没有异步对应的库时使用执行器没有错,但是如果可用的话最好使用异步版本(如果性能足够重要,在你需要的时候写一个异步版本)。
另请注意,ProcessPoolExecutor 可能很棘手:提交给执行程序的所有参数都必须是可挑选的,这对于大型对象而言可能代价高昂。在您只想包装同步库的大多数情况下,我会推荐 ThreadPoolExecutor。
我正在学习异步和 Torando 并且正在努力。首先可以在 Tornado 中使用执行器 class 吗?
下面的示例我正在创建一个 websocket,当收到一条消息时,我想 运行 check() 作为后台的另一个进程。这是一个人为的例子,只是为了我的学习。 INSIDE 或 AFTER 均未打印。如果我们有这个执行器 class?
为什么我们需要像 Motor 这样的异步特定包此外,在我见过的 Torando 的所有示例中,@gen.coroutine 总是在扩展 tornado.web.RequestHandler 的 classes 上完成,在我的示例中,我使用的是 tornado.websocket.WebSocketHandler 也可以在这个 class 中使用 @gen.coroutine 吗?
最后有人能推荐一本关于这个主题的书或深入教程吗?我买了 "Introduction to tornado",但它有点过时,因为它使用 tornado.gen.engine。
def check(msg):
time.sleep(10)
return msg
class SessionHandler(tornado.websocket.WebSocketHandler):
def open(self):
pass
def on_close(self):
pass
# not sure if i needed this decorator or not?
@tornado.web.asynchronous
def on_message(self,message):
print("INSIDE")
with concurrent.futures.ProcessPoolExecutor() as executor:
f=executor.submit(check,"a")
result = yield f
print("AFTER")
要使用yield
,您必须使用@tornado.gen.coroutine
(或@gen.engine
)。 @tornado.web.asynchronous
与 yield
的使用无关,通常仅用于基于回调的处理程序(@asynchronous
仅适用于常规处理程序,不适用于 websockets)。更改装饰器,您应该会看到打印语句 运行.
为什么有人会写一个像 Motor 这样的异步库而不是使用这样的执行器?为了表现。一个线程或进程池比异步地做同样的事情要昂贵得多(主要是在内存方面)。当你需要一个没有异步对应的库时使用执行器没有错,但是如果可用的话最好使用异步版本(如果性能足够重要,在你需要的时候写一个异步版本)。
另请注意,ProcessPoolExecutor 可能很棘手:提交给执行程序的所有参数都必须是可挑选的,这对于大型对象而言可能代价高昂。在您只想包装同步库的大多数情况下,我会推荐 ThreadPoolExecutor。