題主你好,
在潘集等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需定制制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),網(wǎng)絡(luò)營(yíng)銷推廣,成都外貿(mào)網(wǎng)站制作,潘集網(wǎng)站建設(shè)費(fèi)用合理。
方法及相應(yīng)代碼見截圖:
*.方法不只一種, 題主看看如果不合適請(qǐng)追問. 上面這種做法的好處是封裝的這個(gè)函數(shù)func可以帶任意多個(gè)位置參數(shù).? //就圖主的問題來(lái)看, *args就夠了, 如果func函數(shù)中還有關(guān)鍵字參數(shù),則還需要使用**argv.
-----
希望可以幫到題主, 歡迎追問
在前面的例子里學(xué)習(xí)了并發(fā)地執(zhí)行多個(gè)協(xié)程來(lái)下載圖片,也許其中一個(gè)協(xié)程永遠(yuǎn)下載不了,一直阻塞,這時(shí)怎么辦呢?
碰到這種需求時(shí)不要驚慌,可以使用wait()里的timeout參數(shù)來(lái)設(shè)置等待時(shí)間,也就是從這個(gè)函數(shù)開始運(yùn)行算起,如果時(shí)間到達(dá)協(xié)程沒有執(zhí)行完成,就可以不再等它們了,直接從wait()函數(shù)里返回,返回之后就可以判斷那些沒有執(zhí)行成功的,可以把這些協(xié)程取消掉。例子如下:
[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()
結(jié)果輸出如下:
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
看了你發(fā)的函數(shù):
def Wait(self):
self._app.MainLoop()
看名字應(yīng)該是啟動(dòng)了阻塞循環(huán),去處理app的請(qǐng)求,這個(gè)就是需要一直運(yùn)行的,因?yàn)橐坏┩V沽耍愕腶pp請(qǐng)求就沒發(fā)處理了。
如果你需要啟動(dòng)后再執(zhí)行的別的程序,可以使用多進(jìn)程,把這個(gè)啟動(dòng)放在別的進(jìn)程里去執(zhí)行。
如果解決了您的問題請(qǐng)采納!
如果未解決請(qǐng)繼續(xù)追問
期物(Future)是concurrent.futures模塊和asyncio包的重要組件。
python3.4之后標(biāo)準(zhǔn)庫(kù)中有兩個(gè)名為Future的類:concurrent.futures.Future和asyncio.Future.
這兩個(gè)類的作用相同:類的實(shí)例都表示可能已經(jīng)完成活著尚未完成的延遲計(jì)算。與JS庫(kù)中的Promise對(duì)象,Tornado框架中的Future類類似。
通常我們自己不應(yīng)該創(chuàng)建期物,而只能由并發(fā)框架實(shí)例化。
這個(gè)例子中的future.result方法不會(huì)阻塞,因?yàn)閒uture對(duì)象是有as_completed方法產(chǎn)生的。
在asyncio包中,BaseEventLoop.create_task(...)方法接收一個(gè)協(xié)程,排定他的運(yùn)行時(shí)間,然后返回一個(gè)asyncio.Task實(shí)例(也是asyncio.Future類的實(shí)例),因?yàn)門ask是Future的子類,用于包裝協(xié)程。這與Executor.submit(...)方法創(chuàng)建concurrent.futures.Future實(shí)例是一個(gè)道理。
因?yàn)閍syncio.Future類的目的是與yield from一起使用,所以通常不需用使用以下方法:
asyncio.async(coro_or_future, *, loop=None)
這個(gè)函數(shù)統(tǒng)一了協(xié)程和期物:第一個(gè)參數(shù)可以是二者中的任何一個(gè)。如果是 Future或 Task 對(duì)象,那就原封不動(dòng)地返回。如果是協(xié)程,那么 async 函數(shù)會(huì)調(diào)用loop.create_task(...) 方法創(chuàng)建 Task 對(duì)象。loop= 關(guān)鍵字參數(shù)是可選的,用于傳入事件循環(huán);如果沒有傳入,那么 async 函數(shù)會(huì)通過調(diào)用 asyncio.get_event_loop() 函數(shù)獲取循環(huán)對(duì)象.
不過,在asyncio 中,基本的流程是一樣的:在一個(gè)單線程程序中使用主循環(huán)依次激活隊(duì)列里的協(xié)程。各個(gè)協(xié)程向前執(zhí)行幾步,然后把控制權(quán)讓給主循環(huán),主循環(huán)再激活隊(duì)列里的下一個(gè)協(xié)程。
asyncio.wait(...) 協(xié)程的參數(shù)是一個(gè)由期物或者協(xié)程構(gòu)成的可迭代對(duì)象。wait會(huì)分別把各個(gè)協(xié)程包裝進(jìn)入一個(gè)Task對(duì)象。最后的結(jié)果是,wait處理的所有對(duì)象都通過某種方法變成Future實(shí)例。wait是協(xié)程函數(shù),因此返回的是一個(gè)協(xié)程或者生成器對(duì)象。為了驅(qū)動(dòng)協(xié)程,我們把協(xié)程傳給loop.run_until_complete(...)方法。
出現(xiàn)提示wait?is not defined
那就說(shuō)明wait函數(shù)沒有定義,定義wait就好了
Python的內(nèi)置模塊time中有一個(gè)sleep函數(shù),單位是秒,也可以輸入小數(shù)表示毫秒。