【发布时间】:2021-06-02 20:23:33
【问题描述】:
我正在编写一个异步python程序,它执行许多异步功能,但不幸的是必须读取一个串口,而serial不兼容异步,所以我需要利用一个同步函数来读取串口,但是不要'不想阻塞异步函数。
我已经通过以下方式完成了这项工作:
import asyncio
import time
def serialReader():
while True:
print("waiting for new serial values")
time.sleep(4)#simulated waiting on serial port
return "some serial values"
async def func1():
while True:
print("function 1 running")
await asyncio.sleep(1)
async def serialManager():
loop = asyncio.get_running_loop()
while True:
result = await loop.run_in_executor(None, serialReader)
print(result)
async def main():
func1Task = asyncio.create_task(func1())
func2Task = asyncio.create_task(serialManager())
await func2Task
asyncio.run(main())
但我在这里担心的是我可能会产生多个线程,这些线程最终会堆积起来并导致问题。如果这是一个有效的问题,有没有办法查看活动线程?
【问题讨论】:
-
我猜
threading.active_count()会给出活动线程的数量,不确定这与异步的效果如何,我也猜你使用None时使用的默认执行程序有一个限制它可以产生的线程数 -
这似乎有效,它似乎停留在 3 个活动线程上,这是有道理的。谢谢!如果你喜欢,请作为答案
-
当然,我很犹豫,因为线程/异步不是我经常做的,但我已经添加了一个答案。 :D
-
asyncio 是协作式多任务处理——它使用协程而不使用线程。见stackoverflow.com/questions/49005651/…
-
@barny 不会
loop.run_in_exectuor导致线程被生成? OP 似乎为此示例获得了 3 个活动线程
标签: python python-asyncio