簡體   English   中英

python中的異步函數調用

[英]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 ,您將向它們添加回調,這些回調將在結果可用時執行。

我只是使用requestgevent叫做grequests

import grequests
>>> urls = [
    'http://...',
    'http://...'
]
>>> rs = (grequests.get(u) for u in urls)
>>> grequests.map(rs)
[<Response [200]>, <Response [200]>]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM