扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
题主你好,
在潘集等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站设计、网站建设 网站设计制作按需定制制作,公司网站建设,企业网站建设,高端网站设计,网络营销推广,成都外贸网站制作,潘集网站建设费用合理。
方法及相应代码见截图:
*.方法不只一种, 题主看看如果不合适请追问. 上面这种做法的好处是封装的这个函数func可以带任意多个位置参数. //就图主的问题来看, *args就够了, 如果func函数中还有关键字参数,则还需要使用**argv.
-----
希望可以帮到题主, 欢迎追问
在前面的例子里学习了并发地执行多个协程来下载图片,也许其中一个协程永远下载不了,一直阻塞,这时怎么办呢?
碰到这种需求时不要惊慌,可以使用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
看了你发的函数:
def Wait(self):
self._app.MainLoop()
看名字应该是启动了阻塞循环,去处理app的请求,这个就是需要一直运行的,因为一旦停止了,你的app请求就没发处理了。
如果你需要启动后再执行的别的程序,可以使用多进程,把这个启动放在别的进程里去执行。
如果解决了您的问题请采纳!
如果未解决请继续追问
期物(Future)是concurrent.futures模块和asyncio包的重要组件。
python3.4之后标准库中有两个名为Future的类:concurrent.futures.Future和asyncio.Future.
这两个类的作用相同:类的实例都表示可能已经完成活着尚未完成的延迟计算。与JS库中的Promise对象,Tornado框架中的Future类类似。
通常我们自己不应该创建期物,而只能由并发框架实例化。
这个例子中的future.result方法不会阻塞,因为future对象是有as_completed方法产生的。
在asyncio包中,BaseEventLoop.create_task(...)方法接收一个协程,排定他的运行时间,然后返回一个asyncio.Task实例(也是asyncio.Future类的实例),因为Task是Future的子类,用于包装协程。这与Executor.submit(...)方法创建concurrent.futures.Future实例是一个道理。
因为asyncio.Future类的目的是与yield from一起使用,所以通常不需用使用以下方法:
asyncio.async(coro_or_future, *, loop=None)
这个函数统一了协程和期物:第一个参数可以是二者中的任何一个。如果是 Future或 Task 对象,那就原封不动地返回。如果是协程,那么 async 函数会调用loop.create_task(...) 方法创建 Task 对象。loop= 关键字参数是可选的,用于传入事件循环;如果没有传入,那么 async 函数会通过调用 asyncio.get_event_loop() 函数获取循环对象.
不过,在asyncio 中,基本的流程是一样的:在一个单线程程序中使用主循环依次激活队列里的协程。各个协程向前执行几步,然后把控制权让给主循环,主循环再激活队列里的下一个协程。
asyncio.wait(...) 协程的参数是一个由期物或者协程构成的可迭代对象。wait会分别把各个协程包装进入一个Task对象。最后的结果是,wait处理的所有对象都通过某种方法变成Future实例。wait是协程函数,因此返回的是一个协程或者生成器对象。为了驱动协程,我们把协程传给loop.run_until_complete(...)方法。
出现提示wait is not defined
那就说明wait函数没有定义,定义wait就好了
Python的内置模块time中有一个sleep函数,单位是秒,也可以输入小数表示毫秒。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流