如何同时使用python运行2个不同的进程?

时间:2012-07-16 07:46:29

标签: python performance multiprocessing

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

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”函数没有答案。

然后我试图限制执行时间。 所以我发现:Multiprocessingppsignal (~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

2 个答案:

答案 0 :(得分:0)

对于异步编程,请尝试twisted

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

答案 1 :(得分:0)

您的流程是否因网络请求而挂起?在标准库urllib2中,有一个函数urllib2.urlopen,它接受​​一个可选的timeout参数。如果您正在使用它,请尝试设置timeout参数并处理请求失败的情况。