我有一个循环脚本,用于获取法国网站上的信息。它看起来像这样:
def getInfos(a,b,c)
def MyLoop(filename)
我通过其中调用 getinfos
def MyLoop(filename)
values = getInfos()
它运作良好。但有时,脚本会变慢并最终停止。所以我尝试了几个具有不同想法的模块。第一个模块;信号。但是(主观上)有趣的功能在 Windows 上不可用。但是,当它被冻结时,我试图刺激执行:
def reboot(signal, frame):
print '??FROZEN??'
time.sleep(1)
#sys.exit(0)
signal.signal(signal.SIGINT, reboot)
如您所见,我尝试过sys.exit(0)
,但太突然了,而且我不知道真正做了什么。无论如何......经过两个小时的循环,我没有得到这个转换后的“ keyboard interrupt
”函数的答案。
然后我试图限制执行时间。所以我发现:Multiprocessing
,,,pp
。signal (~5%avalaibleOnWindows)
第一个打开了 30 或 40 个其他封闭的 python 进程。第二个,pp,不允许并行化两个不同的函数。不是吗?
你有什么对我有用的吗?或者至少,我可以尝试一些方法来弄清楚第一步在哪里?
14 个月后... 最后,由于缺乏经验,我决定使用多处理。让一些机器人作为执行者,其中 1 个作为可能冻结的外部进程的检查器/杀手。
一、多处理方法:
#my_mp.py
import multiprocessing as mp
import actions as ac
bot_ids = list('ab')
if __name__ == '__main__':
jobs = []
for bot_id in bot_ids:
p = mp.Process(target=ac.Act , args=(bot_id,))
jobs.append(p) ; p.start()
然后,什么是多处理:
#actions.py
import time,random,glob,os,psutil
#________________________
def check_or_kill(eXe,bTm):
age_max = 900
if time.time() - bTm > age_max:
for proc in psutil.process_iter():
if (proc.name == eXe):proc.kill()
return
#________________________
def Act(bot_id):
checker = random.choice(list('ab'))
if bot_id not in checker:
f = open('stTime_%s.txt'%bot_id , 'w') ; f.write('%s'%(time.time())) ; f.close()
#launch the execution file and then, when it's done :
os.remove('stTime_%s.txt'%bot_id)
else:
#get their inner birthtime.
while glob.glob('localfolder_path','stTime_*.txt') != []: check_or_kill('soft.exe',birthtime)
return