2

私は3つのスレッドを持つプログラムを持っています。私はそれらを次のように呼びます:

if __name__ == "__main__":
    while True:
        try:
            t1().start()
        except:
            log.debug('Trouble with t1 synchronizer')
        try:
            t2().start()
        except:
            log.debug('Trouble with t2 synchronizer')
        try:
            t3().start()
        except:
            log.debug('Trouble with t3 synchronizer')

この 3 つのスレッドを常に実行し続けたいと考えています。ただし、t1、t2、および t3 のインスタンスが一度に 1 つしか実行されないようにする必要もあります。

編集

私が考えることができる唯一の解決策は、各スレッドにロックファイルを配置することです。のようなもの

if os.path.exists(lockfile):
   EXIT THREAD
f=open(lockfile,'w')
f.write('lock')
f.close()
THREAD_STUFF
os.remove(lockfile)

しかし、何らかの理由でプログラムが終了した可能性があり、スレッドがまったく起動しない可能性があるため、どういうわけかそれは私にはきれいな解決策のようには見えません。

4

1 に答える 1

2

スレッドがロックファイルを使用して1回だけ実行されるようにする1つの方法は正しいです。

継続的に実行しようとするのではなく、実行されているかどうかを確認する別の方法があります。次のコードを使用して

if __name__ == "__main__":
    try:
        t1().start()
    except:
        log.debug('Trouble with t1 synchronizer')
    try:
        t2().start()
    except:
        log.debug('Trouble with t2 synchronizer')
    try:
        t3().start()
    except:
        log.debug('Trouble with t3 synchronizer')
    Time.sleep(5)
# this sleep allows the threads to start so they will return a True for isAlive()
    while True:
        try:
            if t1().isAlive()==False:
                try:
                    t1().start()
                except:
                    log.debug('Trouble with t1 synchronizer')
            if t2.isAlive()==False:
                try:
                    t2().start()
                except:
                    log.debug('Trouble with t2 synchronizer')
            if t2.isAlive()==False()
               try:
                    t3().start()
                except:
                    log.debug('Trouble with t3 synchronizer')
于 2012-06-16T04:19:40.333 に答える