在Python中,线程数随着Asyncio的增加而缓慢增加

2024-10-04 11:27:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在编写一个Python脚本,它将运行很长一段时间。有一个函数我希望重复运行,因此我创建了一个带有静态包装器方法的类,我将该函数传递给它并用asyncio调用它。当此函数完成或发生崩溃时,我将处理它并重新启动该函数:

class ContinuousProcessWrapper:

    @staticmethod
    async def run_continuous_process(function):
        while True:
            try:
                await function()
            except Exception as e:
               logging.error(e)
               logging.warning("Restarting Continuous Process...")

我从main()方法中将此包装器称为函数,如下所示:

loop = asyncio.get_event_loop()
task = loop.create_task(
        ContinuousProcessWrapper.run_continuous_process(logging_workflow))
loop.run_until_complete(task)

我的函数如下所示:

async def logging_workflow():
    data_processor = DataProcessor(Settings.environment)

    data_client = Client(Settings.account)
    data_client.connect()

    if len(market_ids) > 0:
        # run task here
    else:
        logging.info(f"Sleeping")
        sleep(3600)

它运行正常,应该重新启动,但使用Monit跟踪内存使用情况等。我注意到它以2个线程开始,但每次再次调用该函数时,线程数都会增加1。我猜这表示某个线程没有被释放,而某个线程处于空闲状态?你知道吗

你知道我怎样才能清除线程,使它们不会继续增加吗?或者你有什么建议可以用一种更具python风格的方式来实现(我大部分时间都是C#dev) 我本以为asyncio会在等待之后为我做这些,但也许不会。你知道吗


Tags: 方法函数runloopasynciotaskdataasync