我有一个不和谐机器人,我怀疑由于偶尔慢pycurl
次呼叫而导致周期性问题。经过一些研究后我发现pycurl
不是异步的,可能是我遇到麻烦的原因。
我有这个功能:
def communicate_wallet(wallet_command):
buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.URL, '[::1]')
c.setopt(c.PORT, 7076)
c.setopt(c.POSTFIELDS, json.dumps(wallet_command))
c.setopt(c.WRITEFUNCTION, buffer.write)
c.perform()
c.close()
body = buffer.getvalue()
parsed_json = json.loads(body.decode('iso-8859-1'))
return parsed_json
这相当于一个curl命令,如:
curl -g -d '{ "action": "action_def" }' '[::1]:7076'
我想知道是否存在执行此操作的异步替代方法,因此我可以使用communicate_wallet
调用await
。我似乎找不到pycurl的任何异步兼容的替代品。
由于
答案 0 :(得分:1)
我想知道是否有异步替代方法,因此我可以使用
communicate_wallet
拨打await
。
最简单的选择是使用run_in_executor
作为阻止代码:
loop = asyncio.get_event_loop()
data = await loop.run_in_executor(None, communicate_wallet, wallet_command)
这会将阻塞函数提交给线程池并在完成时唤醒你的协程,允许asyncio在此期间开展业务。
更好的方法是使用本机支持asyncio的http客户端替换pycurl,例如aiohttp。这将在最初进行更多的工作,但从长远来看可能会有所回报,因为它将允许http代码与asyncio运行的任务进行通信,而无需线程同步。
答案 1 :(得分:0)
Tornado软件包似乎以tornado.curl_httpclient.CurlAsyncHTTPClient的形式提供了您想要的内容。