【发布时间】:2018-08-29 15:20:39
【问题描述】:
考虑以下程序。
import asyncio
import multiprocessing
from multiprocessing import Queue
from concurrent.futures.thread import ThreadPoolExecutor
import sys
def main():
executor = ThreadPoolExecutor()
loop = asyncio.get_event_loop()
# comment the following line and the shutdown will work smoothly
asyncio.ensure_future(print_some(executor))
try:
loop.run_forever()
except KeyboardInterrupt:
print("shutting down")
executor.shutdown()
loop.stop()
loop.close()
sys.exit()
async def print_some(executor):
print("Waiting...Hit CTRL+C to abort")
queue = Queue()
loop = asyncio.get_event_loop()
some = await loop.run_in_executor(executor, queue.get)
print(some)
if __name__ == '__main__':
main()
我想要的只是当我按下“CTRL+C”时优雅地关机。但是,执行线程似乎阻止了这种情况(即使我确实调用了shutdown)
【问题讨论】:
-
你是什么意思“#注释下面一行,关机就会顺利”?如果您评论该行,则您在执行程序中什么也不做。你是什么意思“优雅关机”?
shutdown会加入每一个工人,是不是很优雅? -
哦,也许我理解你,因为
queue.get是一个阻塞操作,所以shutdown被永远挂起。您应该先向queue发送一个信号,表明它已经结束。
标签: python python-multithreading python-asyncio