python loop call soon_python3-asyncio 学习笔记 1 -- call_soon
最近在學習python3 的?asyncio, 特將學習筆記記錄于此.
先來個簡單的例子:
import?asyncio
def?hello_world(loop):
print('Hello?World')
loop.stop()
loop?=?asyncio.get_event_loop()
#?Schedule?a?call?to?hello_world()
loop.call_soon(hello_world,?loop)
#?Blocking?call?interrupted?by?loop.stop()
loop.run_forever()
loop.close()
可以看到先是通過
asyncio.get_event_loop()
得到事件循環(huán),而這是 selector_events.BaseSelectorEventLoop 、base_events.BaseEventLoop 的一個實例.。之后調(diào)用?call_soon以達到立即執(zhí)行的目的,這個?call_soon來自base_events.BaseEventLoop ,實際的是拋給了?events.Handle,生成了一個 Handle的實例,實際執(zhí)行是?Handle._run, 但是在實例?Handle后并沒有立即調(diào)用_run,而是將生成的 Handle 實例添加到了?base_events.BaseEventLoop. _ready 中,直到調(diào)用
loop.run_forever()
才開始執(zhí)行, 那么這個 loop.run_forever() 做了啥?
def run_forever(self):
"""Run until stop() is called."""
self._check_closed()
if self.is_running():
raise RuntimeError('This event loop is already running')
if events._get_running_loop() is not None:
raise RuntimeError(
'Cannot run the event loop while another loop is running')
self._set_coroutine_wrapper(self._debug)
self._thread_id = threading.get_ident()
if self._asyncgens is not None:
old_agen_hooks = sys.get_asyncgen_hooks()
sys.set_asyncgen_hooks(firstiter=self._asyncgen_firstiter_hook,
finalizer=self._asyncgen_finalizer_hook)
try:
events._set_running_loop(self)
while True:
self._run_once()
if self._stopping:
break
finally:
self._stopping = False
self._thread_id = None
events._set_running_loop(None)
self._set_coroutine_wrapper(False)
if self._asyncgens is not None:
sys.set_asyncgen_hooks(*old_agen_hooks)
loop.run_forever() 先是檢查是否有正在運行的事件循環(huán), 保證同一時間只有一個loop運行,之后
try:
events._set_running_loop(self)
while?True:
self._run_once()
if?self._stopping:
break
可以看到是一直調(diào)用_run_once(),由于?_run_once()內(nèi)容較多這里就不再貼完整的代碼, 只摘抄關鍵的部分.
ntodo = len(self._ready)
for i in range(ntodo):
handle = self._ready.popleft()
if handle._cancelled:
continue
if self._debug:
pass # not care ...
else:
handle._run()
handle = None # Needed to break cycles when an exception occurs.
可以看出, 所有的call_soon遵循FIFO原則,不過這里還是會block的, 比如在前文中的hello_world中加入耗時的操作. 所以一旦想用異步,還是全部使用異步,要么0要么1.
總結
以上是生活随笔為你收集整理的python loop call soon_python3-asyncio 学习笔记 1 -- call_soon的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx 转发_除了转发和负载均衡,n
- 下一篇: opencv均值滤波_python+op