我正在为 KODI 编写脚本,当出现代码错误时,我发现了一个无限循环。这个循环意味着我必须登录另一个帐户或重新启动计算机才能停止 KODI。
因此,我的问题是,我如何确保while
在各个方面都停止?
这只是脚本的一部分,代码包含在try
. 您还需要知道,try
如果我提出错误,总是有效。
代码中的问题是while
例如 at的部分p.get()
。这会导致错误,因为我在打电话之前没有检查工作是否完成get()
(为了您的缘故,我没有更正这个错误)。
问题是即使我使用try
,意外错误也会导致while
无法停止!
def browse(separate, page):
[...]
# Getting meta data and subtitles
pools = {'metadata': [], 'subtitles': []}
with closing(multiprocessing.Pool(processes=2)) as pool:
provider_meta = call_provider(PROVIDERS['meta_tmdb'])
provider_subtitle = call_provider(PROVIDERS['subtitle_subscene'])
for item in items:
pools['metadata'].append(pool.apply_async(provider_meta.get, args=(item["info"]["code"], item["label"], item["info"]["year"]), callback=pool_stats))
pools['subtitles'].append(pool.apply_async(provider_subtitle.get, args=(item["info"]["code"], item["label"], item["info"]["year"]), callback=pool_stats))
pool_checklist = _create_checklist(pools)
while not xbmc.abortRequested and not dialog.iscanceled():
xbmc.sleep(100)
# Check if are raise a error
for p in pool_checklist:
p.get()
# Break when all requests are done
if all(p.ready() for p in pool_checklist):
break
else:
return
[...]
def _create_checklist(pools):
plist = []
for c in pools.values():
for p in c:
plist.append(p)
return plist
更新
我不确定是否while
唯一会受到编写的代码的影响,while
或者是否有其他方面可能会影响该while
过程。
更新 2
测试是否get()
返回错误。使用 Python 3.x 测试,而不是使用 KODI 使用的 Python 2.x。
更新 3
查看是否get()
返回引发错误的测试。使用 Python 3.4.2 和 Python 2.7.10 测试。
from multiprocessing import Pool
from contextlib import closing
import time
def func(x, i):
if i == 10:
raise Exception('ttt')
return {'x':i}
def go():
try:
def callback(x):
print('done: '+str(x['x']))
pools = []
with closing(Pool(processes=2)) as pool:
for i in range(20):
pools.append(pool.apply_async(func, args=(i,i), callback=callback))
while not all(p.ready() for p in pools):
time.sleep(1)
list = map(lambda p: p.get(), pools)
for l in list:
print(l)
print('Finished with the script')
except:
print('ERROR')
if __name__ == '__main__':
go()
更新 4
问题仍然是:
- 是
while
唯一受编写的代码while
影响还是其他方面会影响while
流程? - 我如何确保
while
遗嘱在各个方面都停止?
更新 5
似乎没有一个解决方案可以让while
意志在各个方面都停止。因此,我认为简单的解决方案是在while
.
def browse(separate, page):
[...]
# Getting meta data and subtitles
pools = {'metadata': [], 'subtitles': []}
with closing(multiprocessing.Pool(processes=2)) as pool:
provider_meta = call_provider(PROVIDERS['meta_tmdb'])
provider_subtitle = call_provider(PROVIDERS['subtitle_subscene'])
for item in items:
pools['metadata'].append(pool.apply_async(provider_meta.get, args=(item["info"]["code"], item["label"], item["info"]["year"]), callback=pool_stats))
pools['subtitles'].append(pool.apply_async(provider_subtitle.get, args=(item["info"]["code"], item["label"], item["info"]["year"]), callback=pool_stats))
pool_checklist = _create_checklist(pools)
while not all(p.ready() for p in pool_checklist):
if xbmc.abortRequested or dialog.iscanceled()
return
xbmc.sleep(100)
# Check the pools for errors
for p in pool_checklist:
p.get()
[...]
def _create_checklist(pools):
plist = []
for c in pools.values():
for p in c:
plist.append(p)
return plist