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とにかく...2時間のループの後、この変換された" "関数では答えが得られません。

それから私は実行時間を制限しようとしました。だから私は見つけました:Multiprocessing、、。最初のものは、30または40の他の素朴なPythonプロセスを開きました。2番目のppは、2つの異なる関数を並列化することを許可していません。いいえ、しませんか?ppsignal (~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
4

2 に答える 2

0

あなたのプロセスはウェブリクエストでハングしていませんか?標準ライブラリurllib2urllib2.urlopenには、オプションのtimeoutパラメータを受け取る関数があります。それが使用している場合は、タイムアウトパラメータを設定し、リクエストが失敗した場合の処理​​を試してください。

于 2012-07-16T08:22:54.850 に答える
0

非同期プログラミングの場合は、ツイストしてみてください

これが初心者のための良い本です:ツイストイントロダクション

于 2012-07-16T07:50:41.527 に答える