2

在我的工作中,他们“利用”龙卷风,但他们没有异步库。是什么让库异步以便它更适合龙卷风之类的东西?有没有什么好的例子,或者我猜你有没有做某事__enter__或者__exit__可以表明你没有阻止?

我发现很难将一些材料拼凑在一起。

4

2 回答 2

4

如果您的库不是异步的并且不支持在 tornado ioloop 中运行,那么您唯一能做的就是在其他线程中运行这些任务。

本质上,有两种选择,具体取决于您是否要接收返回值:

  1. 您将工作放入队列中,一些线程从队列中提取工作并完成这些任务 ==> 没有返回值
  2. 或者您使用 executor 库(python 3.2)并将工作发送到executor,添加一个回调以表示任务完成并将控制权交还给 tornado 的 ioloop(通过挂在循环中的另一个回调)。

如果your_task_func是您想要卸载到另一个线程的同步任务,基本上执行以下操作:

def callback(future):
    # here you want to do some stuff with the value future.result()

EXECUTOR.submit(
        your_task_func
        ).add_done_callback(
            lambda future: tornado.ioloop.IOLoop.instance().add_callback(
                partial(callback, future)))

可以在这篇不错的文章中找到有关此的更多详细信息。

关于马库斯

于 2013-06-02T11:04:21.603 回答
2

异步---你是说线程吗?如果你想同时运行一些代码,你可以使用已经内置在标准库threading中的模块(或更底层的模块) 。例如:thread

import threading
import time

def counter():
    c = 0
    while True:
        print c
        time.sleep(1)
        c += 1

counterThread = threading.Thread(target=counter, name="counter")
counterThread.daemon = True   # if False (default), Python interpreter won't quit until the thread ends
counterThread.start()

锁定对象是用 and 实现的__enter____exit__因此您可以with根据您的问题使用关键字。

另请参阅第三方线程库

于 2013-06-01T01:03:01.530 回答