[英]How to run 2 different processes with python at the same time?
我有一個循環腳本,可以在法語站點上獲取信息。 看起來像這樣:
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)
,但太突然了,我對實際操作並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
對於異步編程,請嘗試扭曲
這是一本適合初學者的好書: Twisted Introduction
您的流程是否掛在Web請求上? 在標准庫urllib2中,有一個函數urllib2.urlopen
,它帶有一個可選的timeout
參數。 如果這是您要使用的,請嘗試設置超時參數並處理請求失敗的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.