2013-05-31 73 views
2

在我的工作中,他們「利用」龍捲風,但他們沒有異步庫。什麼使庫異步,以便它可以更好地適合龍捲風這樣的東西?有沒有什麼好的例子,或者我想你在__enter____exit__中做了什麼,可以表明你沒有阻塞?如何在Python中使庫異步

我發現很難一起劃傷一些材料。

回答

4

如果你的庫不是異步的並且不支持在龍捲風ioloop中運行,那麼你唯一能做的就是在其他線程中運行這些任務。

本質上講,有兩種選擇,這取決於你是否要接收的返回值的:

  1. 你把你的工作隊列中,一些線程從隊列中拉出工作和關閉工作,這些任務==>沒有返回值
  2. 或者您使用executor庫(python 3.2)並將工作發送到executor,添加一個回調以表示任務已完成並將控制權交還給龍捲風的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))) 

更多關於這個細節可以在this nice write-up被發現。

問候 馬庫斯

+0

很好的答案和良好的支持鏈接。謝謝你 – nialloc

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() 

鎖定對象與__enter____exit__實現,這樣就可以使用with關鍵字,按你的問題。請參閱third-party threading libraries

+0

在這種情況下,它是不是我所期待的。但這是一個同樣好的例子,我可以再次使用。感謝您花時間回答 – nialloc