默认执行程序中的任务仍在运行时退出程序

时间:2017-05-06 23:15:26

标签: python multithreading python-asyncio

我有一个程序可以执行一些长时间运行的同步任务,即使其中一些任务尚未完成,也可能需要退出。以下是在main()中启动此类任务的简单程序。 main()之后会立即返回,因此程序应退出。

import asyncio, time

def synchronous_task():
    for i in range(5):
        print(i)
        time.sleep(1)

async def main():
    loop.run_in_executor(None, synchronous_task)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

print('Main thread exiting.')

但我在运行脚本时得到了这个:

$ python3.5 test3.py 
0
Main thread exiting.
1
2
3
4

处理这种情况的目的是什么?事件循环的默认执行程序已经使用守护程序线程并且在没有清理的情况下终止程序在我的情况下是可以的,但我不想使用os._exit()

1 个答案:

答案 0 :(得分:0)

您的问题更多关于如何杀死一个线程。有关详细信息,请查找this帖子。

事件的解决方案是:

import asyncio, time
from functools import partial
import threading
import concurrent


def synchronous_task(ev):
    for i in range(5):
        if ev.isSet():
            print('terminating thread')
            return
        print(i)
        time.sleep(1)

async def main():
    ev = threading.Event()  # see: https://stackoverflow.com/a/325528/1113207

    loop.run_in_executor(None, partial(synchronous_task, ev))
    await asyncio.sleep(2)  # give thread some time to execute, to see results

    ev.set()


loop = asyncio.get_event_loop()
executor = concurrent.futures.ThreadPoolExecutor(5)
loop.set_default_executor(executor)
try:
    loop.run_until_complete(main())
finally:
    loop.run_until_complete(loop.shutdown_asyncgens())
    executor.shutdown(wait=True)  # see: https://stackoverflow.com/a/32615276/1113207
    loop.close()

print('Main thread exiting.')

结果:

0
1
terminating thread
Main thread exiting.
[Finished in 2.2s]