python在协程中增加任务实例操作
1、添加一个任务
task2=visit_url('http://another.com',3)
asynicio.run(task2)
2、这2个程序一共消耗5s左右的时间。并没有发挥并发编程的优势
importasyncio
importtime
asyncdefvisit_url(url,response_time):
"""访问url"""
awaitasyncio.sleep(response_time)
returnf"访问{url},已得到返回结果"
asyncdefrun_task():
"""收集子任务"""
task=visit_url('http://wangzhen.com',2)
task_2=visit_url('http://another',3)
awaitasyncio.run(task)
awaitasyncio.run(task_2)
asyncio.run(run_task())
print(f"消耗时间:{time.perf_counter()-start_time}")
3、如果是并发编程,这个程序只需要消耗3s,也就是task2的等待时间。
要想使用并发编程形式,需要把上面的代码改一下。asyncio.gather会创建2个子任务,当出现await的时候,程序会在这2个子任务之间进行调度。
asyncdefrun_task():
"""收集子任务"""
task=visit_url('http://wangzhen.com',2)
task_2=visit_url('http://another',3)
awaitasynicio.gather(task1,task2)
实例扩展:
importasyncio
fromthreadingimportThread
asyncdefproduction_task():
i=0
whileTrue:
#将consumption这个协程每秒注册一个到运行在线程中的循环,thread_loop每秒会获得一个一直打印i的无限循环任务
asyncio.run_coroutine_threadsafe(consumption(i),
thread_loop)#注意:run_coroutine_threadsafe这个方法只能用在运行在线程中的循环事件使用
awaitasyncio.sleep(1)#必须加await
i+=1
asyncdefconsumption(i):
whileTrue:
print("我是第{}任务".format(i))
awaitasyncio.sleep(1)
defstart_loop(loop):
#运行事件循环,loop以参数的形式传递进来运行
asyncio.set_event_loop(loop)
loop.run_forever()
thread_loop=asyncio.new_event_loop()#获取一个事件循环
run_loop_thread=Thread(target=start_loop,args=(thread_loop,))#将次事件循环运行在一个线程中,防止阻塞当前主线程
run_loop_thread.start()#运行线程,同时协程事件循环也会运行
advocate_loop=asyncio.get_event_loop()#将生产任务的协程注册到这个循环中
advocate_loop.run_until_complete(production_task())#运行次循环
到此这篇关于python在协程中增加任务实例操作的文章就介绍到这了,更多相关python在协程中增加任务内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。