11

古い質問で申し訳ありません。私はそれを明らかにしました。貧弱なスレッド クラスで停止スレッドを開始するにはどうすればよいですか?

EDIT:ループ中です。コードの先頭でもう一度再開したいです。start-stop-restart-stop-restart を実行するにはどうすればよいですか?

私のクラス:

import threading

class Concur(threading.Thread):
    def __init__(self):
        self.stopped = False
        threading.Thread.__init__(self)

    def run(self):
        i = 0
        while not self.stopped:
            time.sleep(1)
            i = i + 1

メインコードでは、次のことが必要です。

inst = Concur()

while conditon:
    inst.start()

    #after some operation
    inst.stop()
    #some other operation
4

3 に答える 3

19

start()メソッドが終了した後にそのメソッドを再度呼び出すことはできないため、スレッドを実際に停止してから再起動することはできませんrun()。ただし、変数を使用して実行を停止し、後で実行を再開してthreading.Condition、実行状態を確認または変更する際の同時実行の問題を回避することができます。

threading.Conditionオブジェクトには、解放されるのを待機するオブジェクトとメソッドが関連付けられており、threading.Lock解放されると待機中のスレッドに通知されます。これが行われていることを示す質問のコードから派生した例を次に示します。サンプル コードでは、Condition変数をサブクラス インスタンスの一部にThreadして、実装をより適切にカプセル化し、追加のグローバル変数を導入する必要がないようにしました。

from __future__ import print_function
import threading
import time

class Concur(threading.Thread):
    def __init__(self):
        super(Concur, self).__init__()
        self.iterations = 0
        self.daemon = True  # Allow main to exit even if still running.
        self.paused = True  # Start out paused.
        self.state = threading.Condition()

    def run(self):
        self.resume()
        while True:
            with self.state:
                if self.paused:
                    self.state.wait()  # Block execution until notified.
            # Do stuff...
            time.sleep(.1)
            self.iterations += 1

    def pause(self):
        with self.state:
            self.paused = True  # Block self.

    def resume(self):
        with self.state:
            self.paused = False
            self.state.notify()  # Unblock self if waiting.


class Stopwatch(object):
    """ Simple class to measure elapsed times. """
    def start(self):
        """ Establish reference point for elapsed time measurements. """
        self.start_time = time.time()
        return self

    @property
    def elapsed_time(self):
        """ Seconds since started. """
        try:
            return time.time() - self.start_time
        except AttributeError:  # Wasn't explicitly started.
            self.start_time = time.time()
            return 0



MAX_RUN_TIME = 5  # Seconds.
concur = Concur()
stopwatch = Stopwatch()

print('Running for {} seconds...'.format(MAX_RUN_TIME))
concur.start()
while stopwatch.elapsed_time < MAX_RUN_TIME:
    concur.resume()
    # Can also do other concurrent operations here...
    concur.pause()
    # Do some other stuff...

# Show Concur thread executed.
print('concur.iterations: {}'.format(concur.iterations))

于 2013-03-31T21:38:48.887 に答える
5

の実装は次のstop()ようになります。

def stop(self):
    self.stopped = True

再起動したい場合は、新しいインスタンスを作成して起動するだけです。

while conditon:
    inst = Concur()
    inst.start()

    #after some operation
    inst.stop()
    #some other operation

ドキュメントでは、クラスのインスタンスごとにメソッドを 1 回だけ呼び出すことができることがThread明確になっています。start()

スレッドを一時停止して再開したい場合は、条件変数を使用する必要があります。

于 2013-03-31T12:50:36.283 に答える