python里并发执行协程时部分阻塞超时怎么办在前面的例子里学习了并发地执行多个协程来下载图片,也许其中一个协程永远下载不了,一直阻塞,这时怎么办呢?
碰到这种需求时不要惊慌,可以使用wait()里的timeout参数来设置等待时间,也就是从这个函数开始运行算起 , 如果时间到达协程没有执行完成,就可以不再等它们了,直接从wait()函数里返回,返回之后就可以判断那些没有执行成功的 , 可以把这些协程取消掉 。例子如下:
[python] view plain copy
import asyncio
async def phase(i):
print('in phase {}'.format(i))
try:
await asyncio.sleep(0.1 * i)
except asyncio.CancelledError:
print('phase {} canceled'.format(i))
raise
else:
print('done with phase {}'.format(i))
return 'phase {} result'.format(i)
async def main(num_phases):
print('starting main')
phases = [
phase(i)
for i in range(num_phases)
]
print('waiting 0.1 for phases to complete')
completed, pending = await asyncio.wait(phases, timeout=0.1)
print('{} completed and {} pending'.format(
len(completed), len(pending),
))
# Cancel remaining tasks so they do not generate errors
# as we exit without finishing them.
if pending:
print('canceling tasks')
for t in pending:
t.cancel()
print('exiting main')
event_loop = asyncio.get_event_loop()
try:
event_loop.run_until_complete(main(3))
finally:
event_loop.close()
结果输出如下:
starting main
waiting 0.1 for phases to complete
in phase 0
in phase 2
in phase 1
done with phase 0
1 completed and 2 pending
canceling tasks
exiting main
phase 1 canceled
phase 2 canceled
python wait()函数问题看python阻塞函数了你发的函数python阻塞函数:
def Wait(self):
self._app.MainLoop()
看名字应该是启动python阻塞函数了阻塞循环python阻塞函数,去处理app的请求 , 这个就是需要一直运行的,因为一旦停止python阻塞函数了,你的app请求就没发处理了 。
如果你需要启动后再执行的别的程序 , 可以使用多进程,把这个启动放在别的进程里去执行 。
如果解决了您的问题请采纳!
如果未解决请继续追问
python多进程中队列不空时阻塞,求解为什么最近接触一个项目,要在多个虚拟机中运行任务,参考别人之前项目的代码,采用了多进程来处理,于是上网查了查python中的多进程
一、先说说Queue(队列对象)
Queue是python中的标准库,可以直接import 引用,之前学习的时候有听过著名的“先吃先拉”与“后吃先吐”,其实就是这里说的队列,队列的构造的时候可以定义它的容量,别吃撑了,吃多了,就会报错,构造的时候不写或者写个小于1的数则表示无限多
import Queue
q = Queue.Queue(10)
向队列中放值(put)
q.put(‘yang')
q.put(4)
q.put([‘yan','xing'])
在队列中取值get()
默认的队列是先进先出的
q.get()
‘yang'
q.get()
4
q.get()
[‘yan', ‘xing']
当一个队列为空的时候如果再用get取则会堵塞 , 所以取队列的时候一般是用到
get_nowait()方法,这种方法在向一个空队列取值的时候会抛一个Empty异常
所以更常用的方法是先判断一个队列是否为空,如果不为空则取值
队列中常用的方法
Queue.qsize() 返回队列的大小
Queue.empty() 如果队列为空,返回True,反之False
Queue.full() 如果队列满了,返回True,反之False
Queue.get([block[, timeout]]) 获取队列,timeout等待时间
推荐阅读
- 公众号1关注多少钱,微信公众号关注多少钱一个
- 液晶电视板面怎么清理污垢,液晶电视表面怎么擦
- python里怎么使用,python怎样用
- 小米的路由器百兆怎么样,小米路由器 百兆
- vb.net开发sw vbnet web
- 时尚视频号封面怎么设置,视频号封面设计
- 南京手机网站制作,南京网站如何制作
- 小区功放插u盘怎么使用,功放机用u盘怎么放歌
- su命令linux su命令切换用户