python异步编程案例之不同线程的事件循环

import asyncio
from threading import Thread
import time
import threading
now = lambda: time.time()
def start_loop(loop):
    asyncio.set_event_loop(loop)
    loop.run_forever()
def do_some_work(x):
    print('start working {}'.format(x), "current thread id:", threading.get_ident())
    time.sleep(x)
    print('work {} is done'.format(x))
start = now()
new_loop = asyncio.new_event_loop() # 主线程中创建一个new_loop
t = Thread(target=start_loop, args=(new_loop,)) # 子线程中开启一个无限事件循环
t.start()
print('TIME: {}'.format(time.time() - start))
new_loop.call_soon_threadsafe(do_some_work, 6)
new_loop.call_soon_threadsafe(do_some_work, 3)
end = now()
print("main thread id", threading.get_ident())
print('total run time {}'.format(end-start))

由于time.sleep是同步阻塞, 一共花了大约6+3, 9秒多. 子线程按顺序执行call_soon_threadsafe注册的do_some_work方法。

TIME: 0.001996755599975586
More work 6 current thread id: 26108
main thread id 13252
total run time 0.001996755599975586
Finished more work 6
More work 3 current thread id: 26108
Finished more work 3

新线程协程

import asyncio
from threading import Thread
import time
import threading
now = lambda: time.time()
def start_loop(loop):
    asyncio.set_event_loop(loop)
    loop.run_forever()
async def do_some_work(x):
    print('start working {}'.format(x), "current thread id:", threading.get_ident())
    await asyncio.sleep(x)
    print('work {} is done'.format(x))
start = now()
new_loop = asyncio.new_event_loop() # 主线程中创建一个new_loop
t = Thread(target=start_loop, args=(new_loop,)) # 子线程中开启一个无限事件循环
t.start()
asyncio.run_coroutine_threadsafe(do_some_work(6), new_loop)
asyncio.run_coroutine_threadsafe(do_some_work(4), new_loop)
end = now()
print("main thread id", threading.get_ident())
print('total run time {}'.format(end-start))

一共大约花了6秒多

main thread id 13252
total run time 0.00199127197265625
start working 6 current thread id: 26556
start working 4 current thread id: 26556
work 4 is done
work 6 is done

上述的例子,主线程中创建一个new_loop,然后在子线程中开启一个无限事件循环。
主线程通过run_coroutine_threadsafe新注册协程对象,这样就能在子线程中进行事件循环的并发操作。

发布了24 篇原创文章 · 获赞 0 · 访问量 894

猜你喜欢

转载自blog.csdn.net/HighDS/article/details/103867409
今日推荐