我需要编写一个在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,则没有任何反应。
我做错了吗?有没有更好的库可以用来做到这一点?
答案 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
。