0

ファイルから(約100万)行を読み取り、それらの行をリストにコピーする単純なアプリを作成しています。次の行が異なる場合は、前の行がスレッドを実行して、そのリストで何らかのジョブを実行します。スレッドジョブはtcpソケットに基づいており、telnetlibを介してコマンドを送受信します。

アプリケーションがハングして何もしないことがあります。try-exceptステートメントにラップしたすべてのtelnet操作、およびソケットへの読み取りと書き込みにもタイムアウトがあります。

私はウォッチドッグを書くことを考えました。ウォッチドッグは、sys.exit()またはそのハング状態で同様の何かを実行します。しかし、今のところ私はそれを作成する方法を考えています、そしてそれでもそれを行う方法がわかりません。だから、あなたが私をたどることができれば、それは素晴らしいことです。

そのファイルに対して、40個のスレッドを作成しています。擬似コードは次のようになります。

lock = threading.Lock()
no_of_jobs = 0

class DoJob(threading.Thread):
    def start(self, cond, work):
        self.work = work
        threading.Thread.start(self)
    def run(self)
        global lock
        global no_of_jobs
        lock.acquire()
        no_of_jobs += 1
        lock.release()

        # do some job, if error or if finished, decrement no_of_jobs under lock
        (...)
main:
#starting conditions:
with open(sys.argv[1]) as targetsfile:
    head = [targetsfile.next() for x in xrange(1)]
    s = head[0]

    prev_cond = s[0]
    work = []

for line in open(sys.argv[1], "r"):
    cond = line([0])
    if prev_cond != cond:
       while(no_of_jobs>= MAX_THREADS):
           time.sleep(1)

       DoJob(cond, work)
       prev_cond = cond
       work = None
       work = []
     work.append(line)

#last job:
       DoJob(cond, work)

while threading.activeCount() > 1:
    time.sleep(1)

よろしくJ

4

1 に答える 1

1

私は過去に以下のようなコードをうまく使用しました(私が書いたpython 3プログラムから):

import threading

def die():
    print('ran for too long. quitting.')
    for thread in threading.enumerate():
            if thread.isAlive():
                    try:
                            thread._stop()
                    except:
                            pass
    sys.exit(1)


if __name__ == '__main__':
    #bunch of app-specific code...

    # setup max runtime
    die = threading.Timer(2.0, die) #quit after 2 seconds
    die.daemon = True
    die.start()

    #after work is done
    die.cancel()
于 2012-12-07T13:01:28.843 に答える