我有一个循环脚本,可以在法国网站上获取信息。它看起来像这样:
def getInfos(a,b,c)
def MyLoop(filename)
我通过
调用getinfosdef 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个月后...... 最后,当然缺乏经验,我决定使用多处理。将一些机器人作为执行者,其中一个作为可能冻结的外部过程的检查者/杀手。首先,多处理方法:
#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
答案 0 :(得分:0)
对于异步编程,请尝试twisted
这是一本适合初学者的好书:Twisted Introduction
答案 1 :(得分:0)
您的流程是否因网络请求而挂起?在标准库urllib2中,有一个函数urllib2.urlopen
,它接受一个可选的timeout
参数。如果您正在使用它,请尝试设置timeout参数并处理请求失败的情况。