フランス語のサイトで情報を取得するためのループスクリプトがあります。このように見えます:
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
とにかく...2時間のループの後、この変換された" "関数では答えが得られません。
それから私は実行時間を制限しようとしました。だから私は見つけました:Multiprocessing
、、。最初のものは、30または40の他の素朴なPythonプロセスを開きました。2番目のppは、2つの異なる関数を並列化することを許可していません。いいえ、しませんか?pp
signal (~5%avalaibleOnWindows)
私のために働くことができる何かがありますか?または少なくとも、最初のステップがどこにあるかを理解するために、私が試すことができる何か?
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