如何编写具有异步方法的包?

时间:2017-03-16 00:36:10

标签: python python-2.7 python-3.x python-requests

我需要编写一个在2.7和3.x中工作的包。该包需要具有以异步方式发出请求的方法。这可能吗?我尝试使用request-futures,但是当我尝试发出多个请求时出错。我也试过了问候,但我甚至无法提出要求。

它看起来像这样:

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 个答案:

答案 0 :(得分:0)

我将回答为什么问候不适合你。使用class Welcome extends MY_Controller { public function index() { $this->load->view('welcome_message'); } } 有点棘手,因为在响应返回之前响应对象将为空,因此您需要继续检查响应对象,这有点像hacky。这可能就是它看起来根本没有做任何事情的原因。

改用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