协程
import asyncio
import time
from threading import Thread
now = lambda :time.time()
def start_loop(loop):
asyncio.set_event_loop(loop)
loop.run_forever()
async def do_some_work(x):
print('Waiting {}'.format(x))
await asyncio.sleep(x)
print('Done after {}s'.format(x))
start = now()
new_loop = asyncio.new_event_loop()
t = Thread(target=start_loop, args=(new_loop,))
t.start()
print('TIME: {}'.format(time.time() - start))
for i in range(100000):#协程开启十万个
asyncio.run_coroutine_threadsafe(do_some_work(i*10), new_loop)
image.png
大约50多秒
线程
import asyncio
import time
from threading import Thread
now = lambda :time.time()
def start_loop(loop):
asyncio.set_event_loop(loop)
loop.run_forever()
async def do_some_work(x):
print('Waiting {}'.format(x))
await asyncio.sleep(x)
print('Done after {}s'.format(x))
start = now()
new_loop = asyncio.new_event_loop()
t = Thread(target=start_loop, args=(new_loop,))
t.start()
print('TIME: {}'.format(time.time() - start))
# for i in range(100000):#协程开启十万个
# asyncio.run_coroutine_threadsafe(do_some_work(i*10), new_loop)
def test_thread(index):
print("waiting {}".format(index*10))
time.sleep(index*10)
print("Done {}".format(index*10))
for i in range(100000):#线程开启十万个
t = Thread(target=test_thread, args=(i,))
t.start()
image.png
消耗时间大约110多秒,电脑甚至卡死。
由上可见 协程比线程占据更少资源