【问题标题】:How to get quantity of active threads in python async如何在python异步中获取活动线程的数量
【发布时间】: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


【解决方案1】:

您可以使用threading.active_count() 获取活动线程数。

来自文档

返回当前活跃的 Thread 对象的数量。返回的计数等于 enumerate() 返回的列表的长度。

当您在loop.run_in_executor 中使用None 时,将使用默认执行程序,默认情况下它对可以生成的线程数有限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-18
    • 2021-08-13
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多