我正在使用Python3 Asyncio模块创建负载平衡应用程序。我有两项繁重的IO任务:
这两个进程将永远运行,彼此独立,不应被另一个进程阻塞。
我不能使用1个事件循环,因为它们会互相阻塞,有什么办法可以使2个事件循环,还是我必须使用多线程/处理?
我尝试使用asyncio.new_event_loop(),但还没有设法使它工作。
参考方案
asyncio
的全部要点是,您可以同时运行数千个I / O繁重的任务,因此根本不需要Thread
,这正是asyncio
的用途。只需在同一循环中运行两个协程(SNMP和代理)即可。
在调用loop.run_forever()
之前,必须使它们都可用于事件循环。像这样:
import asyncio
async def snmp():
print("Doing the snmp thing")
await asyncio.sleep(1)
async def proxy():
print("Doing the proxy thing")
await asyncio.sleep(2)
async def main():
while True:
await snmp()
await proxy()
loop = asyncio.get_event_loop()
loop.create_task(main())
loop.run_forever()
我不知道您的代码的结构,因此不同的模块可能会有自己的无限循环或某种东西,在这种情况下,您可以运行以下代码:
import asyncio
async def snmp():
while True:
print("Doing the snmp thing")
await asyncio.sleep(1)
async def proxy():
while True:
print("Doing the proxy thing")
await asyncio.sleep(2)
loop = asyncio.get_event_loop()
loop.create_task(snmp())
loop.create_task(proxy())
loop.run_forever()
请记住,snmp
和proxy
都必须是以异步感知方式编写的协程(async def
)。 asyncio
不会使简单的阻止Python函数突然“异步”。
在您的特定情况下,我怀疑您有点困惑(没有冒犯!),因为编写良好的异步模块永远不会在同一循环中互相阻塞。如果是这种情况,则根本不需要asyncio
,而只需要在单独的Thread
中运行其中的一个即可,而无需处理任何asyncio
东西。
我应该在代码中替换while True(不使用asyncio)还是应该使用asyncio事件循环来实现相同的结果。目前,我正在处理某种与“ zeromq”连接的“工作者”,接收一些数据,然后对外部工具(服务器)执行一些请求(http)。一切都以普通的阻塞IO编写。使用asyncio事件循环摆脱while True: ...是否有意义?将来可能会用asynci…
Python GPU资源利用 - python我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…
Python:图像处理可产生皱纹纸效果 - python也许很难描述我的问题。我正在寻找Python中的算法,以在带有某些文本的白色图像上创建皱纹纸效果。我的第一个尝试是在带有文字的图像上添加一些真实的皱纹纸图像(具有透明度)。看起来不错,但副作用是文本没有真正起皱。所以我正在寻找更好的解决方案,有什么想法吗?谢谢 参考方案 除了使用透明性之外,假设您有两张相同尺寸的图像,一张在皱纹纸上明亮,一张在白色背景上有深…
Python uuid4,如何限制唯一字符的长度 - python在Python中,我正在使用uuid4()方法创建唯一的字符集。但是我找不到将其限制为10或8个字符的方法。有什么办法吗?uuid4()ffc69c1b-9d87-4c19-8dac-c09ca857e3fc谢谢。 参考方案 尝试:x = uuid4() str(x)[:8] 输出:"ffc69c1b" Is there a way to…
Python sqlite3数据库已锁定 - python我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…