簡體   English   中英

Python 進程是否應該等待使用“run_in_executor”分叉的作業,盡管我沒有等待?

[英]Should Python process wait for a job forked using `run_in_executor`, although I did not wait for?

假設我們有以下腳本:


def sync_sleep(x):
    print("sync_sleep going to sleep")
    time.sleep(x)
    print("sync_sleep awake")


async def main():
    loop = asyncio.get_running_loop()
    loop.run_in_executor(None, sync_sleep, 4)
    print("main going to sleep")
    await asyncio.sleep(1)
    print("main awake ")


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    print("main finished")

注意:我故意省略loop.close

現在當我執行上面的腳本時:

python script.py

我有以下 output:

sync_sleep going to sleep
main going to sleep
main awake 
main finished
sync_sleep awake

我預計在運行腳本后,打印"main finished"后進程會退出,但直到作業sync_sleep完成后才退出。 我的意思是,如果我想等待那份工作,我會添加以下行:

loop.run_until_complete(loop.shutdown_default_executor())

我的期望錯了嗎?

默認的ThreadPoolExecutor在退出時等待守護線程,這意味着進程等待線程完成,然后才停止。

除了自己實現一個Executor class 之外,除了使用threading模塊使用daemon=True創建一個新線程之外別無選擇。 如果你想在asyncio中等待那個線程,你總是可以運行一個執行器來await thread.join()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM