1

我有一个循环脚本,用于获取法国网站上的信息。它看起来像这样:

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,,,ppsignal (~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
4

2 回答 2

0

您的进程是否被 Web 请求挂起?在标准库urllib2中有一个函数urllib2.urlopen接受一个可选timeout参数。如果这是您正在使用的,请尝试设置超时参数并处理您的请求失败的情况。

于 2012-07-16T08:22:54.850 回答
0

对于异步编程尝试扭曲

这是一本适合初学者的好书:Twisted Introduction

于 2012-07-16T07:50:41.527 回答