如何在python中使库异步

时间:2013-05-31 09:04:08

标签: python asynchronous tornado

在我的工作中,他们“利用”龙卷风,但他们没有异步库。什么使库异步,以便它更适合龙卷风?有没有很好的例子,或者我猜你在__enter____exit__做了哪些事情表明你没有阻止?

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

2 个答案:

答案 0 :(得分:4)

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

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

  1. 你把你的工作放在一个队列中,一些线程从队列中拉出工作并完成这些任务==>没有回报值
  2. 或者您使用执行程序库(python 3.2)并将工作发送到executor,添加回调以表示任务已完成并将控制权交还给龙卷风的ioloop(通过循环中的另一个回调)。
  3. 如果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)))
    

    有关此内容的更多详情,请参阅this nice write-up

    问候 马库斯

答案 1 :(得分:2)

异步---你的意思是线程?如果要同时运行某些代码,可以使用已standard library中内置的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()

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

另见third-party threading libraries