2017-03-16 60 views
0

我需要編寫一個適用於2.7和3.x的包。該包需要具有以異步方式發送發佈請求的方法。這可能嗎?我嘗試使用request-futures,但是當我嘗試做出多個請求時出現錯誤。我也嘗試了grequests,但我甚至無法提出請求。如何編寫具有異步方法的程序包?

這將是這個樣子:

my_package.py

def _make_request(payload): 
    requests.post(
     SERVICE_URL, 
     data=json.dumps(payload), 
    ) 

def do_thing_a(): 
    _make_request(some_payload) 

def do_thing_b(): 
    _make_request(some_other_payload) 

code_that_uses_my_package.py

do_thing_a() 
    do_thing_b() 

如果我使用請求同步能正常工作。如果我使用請求 - 期貨,並且將 session = FuturesSession()行添加到每個方法並將requests.post更改爲session.post,則會出現此錯誤。

TypeError: 'NoneType' object is not callable 
<async at 0x3f657f0> failed with TypeError 

如果我只做一個異步調用,但它確實工作。 如果我嘗試使用grequests並使用grequests.post + greqeuests.send,則不會發生任何事情。

我做錯了什麼?有沒有更好的圖書館來做到這一點?

+1

Woiuld像[Twisted](https://twistedmatrix.com/trac/)的幫助? – tadman

回答

0

我會回答爲什麼grequests不適合你。使用grequests.send有點棘手,因爲在響應回來之前響應對象將是空的,所以您需要繼續檢查響應對象,這有點冒險。這可能就是爲什麼它看起來沒有做任何事情。

改爲使用grequests.map;它在等待響應時不會阻塞,但在所有請求返回之前它不會執行下一行。如果您有多個請求,則將它們與grequests.map一起發送,它們將異步運行。下面是一個例子與您的代碼示例:

def _make_request(payload): 
    return grequests.post(
     SERVICE_URL, 
     data=json.dumps(payload), 
    ) 

def do_thing_a(): 
    return _make_request(some_payload) 

def do_thing_b(): 
    return _make_request(some_other_payload) 

reqs = [do_thing_a(), do_thing_b()] 
grequests.map(reqs) 
print reqs[0].response, reqs[1].response 

req不必包括多個請求,也可以是一個單一的元素列表。看看grequests.imap如果你有興趣獲得他們進來的多個請求的迴應。