我目前正在处理一个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)
它可以正常运行并重新启动,但是使用How to build a Chatbot with Watson Assistant (free chatbot course)来跟踪内存使用情况等。我注意到它从2个线程开始,但是每次再次调用该函数时,线程数都会增加1。我猜这表明没有处理任何东西,并且线程处于空闲状态?
您知道我如何清除线程,以免它们继续增加吗?或对如何以更Python化的方式完成此操作有任何建议(大多数时候我是C#开发人员) 我本以为asyncio会在等待后为我执行此操作,但也许不会。