gpt4 book ai didi

python-3.x - python 3.5+ 中 pycurl 的异步替代方案

转载 作者:行者123 更新时间:2023-12-04 16:03:53 25 4
gpt4 key购买 nike

我有一个 discord 机器人,我怀疑它由于偶尔缓慢的 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'

我想知道是否有异步替代方法来执行此操作,因此我可以使用 await 调用 communicate_wallet。我似乎找不到 pycurl 的任何异步兼容替代品。

谢谢

最佳答案

I'm wondering if there's an async alternative to do this, so i can call communicate_wallet with 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 运行的任务进行通信而无需线程同步。

关于python-3.x - python 3.5+ 中 pycurl 的异步替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49562497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com