为什么asyncio.get_event_loop方法检查当前线程是否为主线程?

时间:2019-04-12 17:18:36

标签: python multithreading python-asyncio

为什么asyncio(source)中的> setDT(dt)[,mean(Activity),by=.(Sex,Genotype)] Sex Genotype V1 1: male ff 2.0835 2: male fs 2.6760 3: female ff 3.5270 4: female ss 3.6200 方法正在检查当前线程是否为主线程(请参见下面的代码段中的注释)?

get_event_loop

1 个答案:

答案 0 :(得分:2)

为方便起见,asyncio支持自动创建事件循环,而无需执行对new_event_loop()set_event_loop()的调用。由于事件循环的创建成本适中,并且会消耗一些OS资源,因此它不是在导入时自动创建的,而是按需自动创建的,尤其是在第一次调用get_event_loop()时。 (asyncio.run已废弃此功能,该功能始终会创建一个新的事件循环,然后自动创建的事件循环会导致problems。)

但是,此便利是为主线程保留的-任何其他线程都必须显式设置事件循环。造成这种情况的原因可能有几种:

  • 防止混淆-您不希望从任意线程中意外调用get_event_loop()来为该线程分配“主”(自动创建的)事件循环;
  • 某些异步功能最好在需要在主线程中运行事件循环时使用,例如subprocessessignal handling

还可以通过在每个线程中自动创建一个调用get_event_loop()的新事件循环来避免这些问题,但是这很容易意外地创建了多个协程为无法相互通信,这将与asyncio的设计背道而驰。因此,剩下的选择是让代码对主线程进行特殊处理,从而鼓励开发人员使用该线程执行异步代码。