3

whileループで、forループで作成されるすべてのスレッドを最大5秒ブロックしたいと思います。ただし、次のコードはスレッドによって1つずつブロックされます。どうすれば目標に近づくことができますか?ありがとう。

threads = []
while True:
    for 3:
        newThread = threading.Thread(..)
        threads.append(newThread)
        newThread.start()
        newThread.join(5)
4

3 に答える 3

3

条件変数を使用する必要があります(threading.ConditionPythonの場合)。述語が真になるのを待つことができます。あなたの場合、述語はall threads have finished work or time out exceededです。これは、10個のスレッドを作成し、5秒のタイムアウトで終了するまで待機するコードです。詳細なログは次のことに役立ちます。

import threading
import time
import logging


logging.basicConfig(
    format='%(threadName)s:%(message)s',
    level=logging.DEBUG,
)


NUM_OF_THREADS = 10
TIMEOUT = 5


def sleeping_thread(delay, cond):
    logging.debug("Hi, I'm going to delay by %d sec." % delay)
    time.sleep(delay)
    logging.debug("I was sleeping for %d sec." % delay)
    cond.acquire()
    logging.debug("Calling notify().")
    cond.notify()
    cond.release()


def create_sleeping_thread(delay, cond):
    return threading.Thread(target=sleeping_thread,
                            args=(delay, cond))


if __name__ == '__main__':
    cond = threading.Condition(threading.Lock())
    cond.acquire()

    working_counter = NUM_OF_THREADS
    for i in xrange(NUM_OF_THREADS):
        t = create_sleeping_thread(i, cond)
        t.start()

    start_time = time.time()
    while working_counter > 0 and (time.time() - start_time < TIMEOUT):
        cond.wait()
        working_counter -= 1
        logging.debug('%d workers still working', working_counter)
    cond.release()
    logging.debug('Finish waiting for threads (%d workers still working)',
                 working_counter)

詳細については、comp.programming.threadsFAQをご覧ください。

于 2011-10-29T12:05:15.523 に答える
2

行うべきことの1つは、すべてのスレッドを開始してから、配列を反復処理して結合することです。しかし、これでも合計5*スレッドカウント秒まで待機すると思います。または、スレッドを無期限に待機するスレッドを1つ追加することもできます。次に、メインスレッドで、追加のスレッドを5秒間待つことができます。

于 2011-10-29T08:53:54.787 に答える
0

すでに実行中のスレッドの1つが終了した場合を除いて、5秒ごとにスレッドを生成しようとしていますか?新しいスレッドをより早く生成したいですか?その場合、athreading.Eventを使用してワーカースレッドが終了したことを通知し、を使用event.wait(timeout)してイベントを最大5秒ブロックできます。

import threading
import time
import logging

logger=logging.getLogger(__name__)

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s: %(message)s',
                    datefmt='%H:%M:%S')

def foo_event(n,e):
    time.sleep(n)
    name=threading.current_thread().name
    logger.info('{n}: setting event'.format(n=name))
    e.set()

def main():
    e=threading.Event()
    threads=[]
    N=5
    for i in range(3):
        t=threading.Thread(target=foo_event,args=(N+1,e,),name='worker-{i}'.format(i=i))
        threads.append(t)
        t.daemon=True
        t.start()
        logger.info('entering wait')
        e.wait(N)
        logger.info('exit wait')
        e.clear()

main()

収量

05:06:34: entering wait
05:06:39: exit wait                 <-- Wait 5 seconds
05:06:39: entering wait
05:06:40: worker-0: setting event   
05:06:40: exit wait                 <-- Wait <5 seconds
05:06:40: entering wait
05:06:45: worker-1: setting event
05:06:45: exit wait                 <-- Wait 5 seconds
于 2011-10-29T09:01:41.240 に答える