0

私のプログラムは、baz私のメソッドから新しいスレッドでメソッドを呼び出しますspam

ここで、この新しいスレッド内から毎秒 self.track の値を確認する必要があります。

import threading
class A(threading.Thread):

def __init__(self, player):
    self.track = True

def Baz(self):
    // how do i check the value of self.track every 1 second here
    while self.track:
        // do something


def Spam(self):
    player_thread = Thread(target=self.Baz)
    player_thread.start()

1秒ごとに確認するにはどうすればよいですか?

4

3 に答える 3

1

ポーリングしたい場合はtime.sleep、ループ内で使用してください。

import time
...
    while self.track:
        time.sleep(1)

より正確さが必要な場合、たとえば、ループ内で他の操作を実行していて、自明ではない時間がかかる場合は、次のようにします。

...
while self.track:
    start = time.time()
    # Do things here
    sleep_time = start-time.time() + 1
    if sleep_time > 0:
        time.sleep(sleep_time)

self.trackが に設定されるまでスレッドをブロックしようとしている場合は、別の角度からこれに到達することもできますTrue。それが起こる前にすべてのワーカーが作成されます。

class A(object):

    def __init__(self, player):
        self._track = False
        self.player = player
        self._track_condition = threading.Condition()
    @property
    def track(self):
        return self._track
    @track.setter(self, value):
        if value:
            self._track_condition.acquire()
            self._track_condition.notify_all()
            self._track_condition.release()
        self._track = value
   def baz(self):
       self._track_condition.acquire()
       self._track_condition.wait()
       self._track_condition.release()
       while self.track:
           # Do stuff
   def spam(self):
       player_thread = threading.Thread(target=self.baz)
       player_thread.start()

ただし、プレーヤーのアクションが I/O バウンドでない限り、threadingおそらくパフォーマンスにあまり影響を与えず、パフォーマンスを損なう可能性さえあることに注意してください。 threading.ThreadはすべてGIL内に存在するため、実際には同時に並行して実行することはできません。あなたがそれを望むなら、あなたが必要multiprocessingです。

于 2013-06-27T13:22:04.930 に答える