[英]Async function call in python
在python中,我想在創建線程的類中創建一個異步方法而不會阻塞主線程。 新線程結束后,我從該函數/線程返回一個值。
例如,該類用於從網頁檢索某些信息。 我想在下載頁面並返回對象的函數中運行並行處理。
class WebDown:
def display(self, url):
print 'display(): ' + content
def download(self, url):
thread = Thread(target=self.get_info)
# thread join
print 'download(): ' + content
# return the info
def get_info(self, url):
# download page
# retrieve info
return info
if __name__ == '__main__':
wd = WebDown()
ret = wd.download('http://...')
wd.display('http://...')
在此示例中,為了在調用顯示其他信息的display()之后,依次調用download()來檢索信息。 打印輸出應為
display(): foo, bar, ....
download(): blue, red, ....
用python編寫異步,非阻塞代碼的一種方法涉及使用Python的Twisted。 Twisted不依賴多線程,而是使用多處理 。 它為您提供了方便的方法來創建Deferred對象,並向它們添加回調和errbacks。 您提供的示例在Twisted中看起來像這樣,我使用的是treq (Twisted Requests)庫,該庫使生成請求更快,更輕松:
from treq import get
from twisted.internet import reactor
class WebAsync(object):
def download(self, url):
request = get(url)
request.addCallback(self.deliver_body)
def deliver_body(self, response):
deferred = response.text()
deferred.addCallback(self.display)
return deferred
def display(self, response_body):
print response_body
reactor.stop()
if __name__ == "__main__":
web_client = WebAsync()
web_client.download("http://httpbin.org/html")
reactor.run()
'download'和'deliver_body'方法都返回deferred ,您將向它們添加回調,這些回調將在結果可用時執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.