py协程(2)

# -*- coding: utf-8 -*-
'''
sublime
py 3.6
'''

import time
import asyncio

async def work_1():
	print("work_1 start")
	await asyncio.sleep(1)
	return 1

async def work_2():
	print("work_2 start")
	await asyncio.sleep(2)
	return 2/0

async def work_3():
	print("work_3 start")
	await asyncio.sleep(3)
	return 3

start = time.perf_counter()
loop = asyncio.get_event_loop()
re = loop.run_until_complete(asyncio.gather(
	work_1(),
	work_2(),
	work_3(),
	return_exceptions=True))
loop.close()
print(re)
print("Wall time: {:.2f}".format(time.perf_counter() - start))

# work_2 start
# work_3 start
# work_1 start
# [1, ZeroDivisionError('division by zero',), 3]
# Wall time: 3.01
# [Finished in 3.5s]


  • 协程嵌套
import time
import asyncio

now = lambda: time.perf_counter()

async def do_some(x):
	print('Waiting:', x)
	await asyncio.sleep(x)
	return 'Done after:{}'.format(x)

async def main():
	
	coroutine1 = do_some(1)
	coroutine2 = do_some(2)
	coroutine3 = do_some(3)

	tasks = [
			 asyncio.ensure_future(coroutine1),
			 asyncio.ensure_future(coroutine2),
			 asyncio.ensure_future(coroutine3)]

	d = await asyncio.wait(tasks)
	print('print d:', d)

	for task in tasks:
		print('Task ret:', task.result())

star = now()

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
print('Wall time:', now() - star)

# # Output:
# Waiting: 1
# Waiting: 2
# Waiting: 3
# print d: ({……}, set())
# Task ret: Done after:1
# Task ret: Done after:2
# Task ret: Done after:3
# Wall time: 3.0142854037972056
# [Finished in 3.7s]


# 优化
async def main():

	task_1 = asyncio.ensure_future(do_some(1))
	task_2 = asyncio.ensure_future(do_some(2))
	task_3 = asyncio.ensure_future(do_some(3))

	ret, p = await asyncio.wait((task_1, task_2, task_3))
	print(ret)

	for task in ret:
		print('Task ret:', task.result())

star = now()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
print('Wall time:', now() - star)

# Output:
Waiting: 1
Waiting: 2
Waiting: 3
{……}
Task ret: Done after:1
Task ret: Done after:3
Task ret: Done after:2
Wall time: 3.0079233217578616
[Finished in 3.6s]

  • 取消/某些异常处理
# -*- encoding: utf-8 -*-
'''
py 3.6
sublime
'''

import time
import asyncio

now = lambda: time.perf_counter()

async def work_1():
	await asyncio.sleep(1)
	return 1

async def work_2():
	await asyncio.sleep(2)
	return 2 / 0

async def work_3():
	await asyncio.sleep(3)
	return 3

async def main():

	task_1 = asyncio.ensure_future(work_1())
	task_2 = asyncio.ensure_future(work_2())
	task_3 = asyncio.ensure_future(work_3())

	await asyncio.sleep(2)
	task_3.cancel()

	ret = await asyncio.gather(*(task_1, task_2, task_3), 
		return_exceptions=True)
	print(ret)

star = now()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
print('Wall time:', now() - star)

# Output
[1, ZeroDivisionError('division by zero',), CancelledError()]
Wall time: 2.0075206354112836
[Finished in 2.5s]
  • 生产者/消费者模型
# -*- encoding: utf-8 -*-

import time
import asyncio
import random

now = lambda: time.perf_counter()

async def consumer(queue, id):
	while True:
		val = await queue.get()
		print('{} get a val: {}'.format(id, val))
		await asyncio.sleep(1)

async def producer(queue, id):
	for i in range(5):
		val = random.randint(1, 10)
		await queue.put(val)
		print('{} put a val: {}'.format(id, val))
		await asyncio.sleep(1)

async def main():
	queue = asyncio.Queue()

	consumer_1 = asyncio.ensure_future(consumer(queue, 'consumer_1'))
	consumer_2 = asyncio.ensure_future(consumer(queue, 'consumer_2'))

	producer_1 = asyncio.ensure_future(producer(queue, 'producer_1'))
	producer_2 = asyncio.ensure_future(producer(queue, 'producer_2'))

	await asyncio.sleep(10)
	consumer_1.cancel()
	consumer_2.cancel()

	ret = await asyncio.gather(*(consumer_1, consumer_2, producer_1, producer_2), return_exceptions=True)
	print(ret)

start = now()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
print(now() - start)

# # 1 未import random
# [CancelledError(), CancelledError(), NameError("name 'random' is not defined",), NameError("name 'random' is not defined",)]
# 10.004357102493637
# [Finished in 10.5s]
# # 2
# producer_1 put a val: 2
# producer_2 put a val: 2
# consumer_1 get a val: 2
# consumer_2 get a val: 2
# producer_1 put a val: 2
# producer_2 put a val: 4
# consumer_2 get a val: 2
# consumer_1 get a val: 4
# producer_1 put a val: 7
# producer_2 put a val: 3
# consumer_1 get a val: 7
# consumer_2 get a val: 3
# producer_1 put a val: 2
# producer_2 put a val: 8
# consumer_2 get a val: 2
# consumer_1 get a val: 8
# producer_1 put a val: 6
# producer_2 put a val: 2
# consumer_1 get a val: 6
# consumer_2 get a val: 2
# [CancelledError(), CancelledError(), None, None]
# 10.003918192487696
# [Finished in 10.6s]

参考链

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值