python 3.5+中pycurl的异步替代

时间:2018-03-29 18:03:41

标签: python-3.x curl python-asyncio

我有一个不和谐机器人,我怀疑由于偶尔慢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的任何异步兼容的替代品。

由于

2 个答案:

答案 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的形式提供了您想要的内容。