import asyncio import time async def get_html(url): print("start get url") await asyncio.sleep(2) # 耗时操作 要加await print("end get url") if __name__ == "__main__": start_time = time.time() loop = asyncio.get_event_loop() # 创建event_loop 对象 如果要创建新的event_loop对象 需要使用asyncio.new_event_loop() tasks = [get_html("http://www.imooc.com") for i in range(10)] loop.run_until_complete(asyncio.wait(tasks)) # run_until_complete() 启动协程 asyncio.wait(tasks) 循环多个asyncis.wait(可迭代对象,启动多个对象) loop.run_until_complete(asyncio.gather(tasks)) print(time.time()-start_time) # gather和wait的区别 # gather比wait更加高一级 推荐使用gather group1 = [get_html("http://projectsedu.com") for i in range(2)] group2 = [get_html("http://www.imooc.com") for i in range(2)] group1 = asyncio.gather(*group1) group2 = asyncio.gather(*group2) group2.cancel() loop.run_until_complete(asyncio.gather(group1, group2)) print(time.time() - start_time) # 结果 可以在2秒能完成所有的并发 start get url start get url start get url start get url start get url start get url start get url start get url start get url start get url end get url end get url end get url end get url end get url end get url end get url end get url end get url end get url 2.003009080886841
import asyncio import time from functools import partial async def get_html(url): print("start get url") await asyncio.sleep(2) return "bobby" def callback(url, future): print(url) print("send email to bobby") if __name__ == "__main__": start_time = time.time() loop = asyncio.get_event_loop() # asyncio.get_event_loop方法可以创建一个事件循环 创建event_loop 对象 如果要创建新的event_loop对象 需要使用asyncio.new_event_loop() # get_future = asyncio.ensure_future(get_html("http://www.imooc.com")) task = loop.create_task(get_html("http://www.imooc.com")) # asyncio.ensure_future 和 loop.create_task都可以创建一个task, 任务对象task 其实是run_until_complete方法将协程包装成为了一个任务(task)对象。所谓task对象是Future类的子类。保存了协程运行后的状态,用于未来获取协程的结果。 task.add_done_callback(partial(callback, "http://www.imooc.com")) # add_done_callback 执行函数的回调 partial可以给回调函数添加参数 loop.run_until_complete(task) # run_until_complete将协程注册到事件循环,并启动事件循环 print(task.result()) # task.result() 获取task返回值
import asyncio import time async def get_html(sleep_times): print("waiting") await asyncio.sleep(sleep_times) print("done after {}s".format(sleep_times)) if __name__ == "__main__": task1 = get_html(2) task2 = get_html(3) task3 = get_html(3) tasks = [task1, task2, task3] loop = asyncio.get_event_loop() try: loop.run_until_complete(asyncio.wait(tasks)) except KeyboardInterrupt as e: all_tasks = asyncio.Task.all_tasks() # asyncio.Task.all_tasks() 获取所有的 tasks for task in all_tasks: print("cancel task") print(task.cancel()) # # 取消成功返回True,取消失败返回False loop.stop() # 停止时间循环 loop.run_forever() # 重新启动事件循环 注释会抛异常 finally: loop.close()
import asyncio async def compute(x, y): print(‘Compute %s + %s .....‘ % (x, y)) await asyncio.sleep(1.0) return x + y async def print_sum(x, y): result = await compute(x, y) print(‘%s + %s =%s‘ % (x, y, result)) loop = asyncio.get_event_loop() loop.run_until_complete(print_sum(1, 2)) loop.close()
import asyncio def callback(sleep_time): print(‘sleep {} success‘.format(sleep_time)) def stoploop(loop): loop.stop() if __name__ == "__main__": loop = asyncio.get_event_loop() loop.call_soon(callback, 2) # 下个循环立即执行 loop.call_soon(stoploop, loop) loop.run_forever() loop.close()
import asyncio def callback(sleep_time): print(‘sleep {} success‘.format(sleep_time)) def stoploop(loop): loop.stop() if __name__ == "__main__": loop = asyncio.get_event_loop() loop.call_later(2, callback, 2.0) # 2秒之后运行 loop.call_later(1, callback, 1.0) # 1秒之后运行 loop.call_later(3, callback, 3.0) # 3秒之后运行 loop.run_forever() loop.close() # 结果 sleep 1.0 success sleep 2.0 success sleep 3.0 success
原文:https://www.cnblogs.com/yoyo1216/p/11236008.html