0

私はマルチプロセッシングが Python でどのように機能するかを学ぼうとしており、私の理解をテストするための非常に単純なスクリプトを作成しました。

プロセス内で while ループの後に発生する値の割り当てが完了していないように見えるという事実を除いて、すべてが正常に機能しているように見えます。

while ループを for ループに置き換えるか、完全に削除すると、すべてが期待どおりに機能するように見えます。

main.py は次のとおりです。

from timepieces import Stopwatch

def run():
    watch = Stopwatch()
    watch.start()

    can_count =  0 if (raw_input('Press q to stop and see seconds counted') == 'q') else 1

    watch._can_count.value = can_count

    print watch.get_seconds()

if __name__ == "__main__":
    run() 

そして、timepieces.py ファイル (プロセスを作成および制御するクラスが含まれています):

from multiprocessing import Process, Value
import time
import math

class Stopwatch:
    _count_val = None
    _proc = None
    _can_count = None

    def count_seconds(self, can_count, count_val):
        seconds = 0
        count_val.value = 23
        #print can_count.value == 1

        while can_count.value == 1:
            seconds += 1

        count_val.value = seconds

    def start(self):
        self._count_val = Value('i', 0)
        self._can_count = Value('i', 1)

        self._proc = Process(target = self.count_seconds, args = (self._can_count, self._count_val))
        self._proc.start()

    def get_seconds(self):
        return self._count_val.value

どんな考えでも大歓迎です。

4

2 に答える 2

1

終了したら、子プロセスに参加する必要があります。これは、あなたが達成しようとしていることのより明確な例です。プロセスに関連するすべてのものが 1 つのクラスにカプセル化されていることに注目してください。クリーンなインターフェースを介してそれらとやり取りできる場合、スレッドとプロセスの処理がはるかに簡単になります。

メインモジュールはこちら

from asynctimer import AsyncTimer
import time

def run():
    atimer = AsyncTimer()

    atimer.start()

    print 'initial count: ', atimer.get_seconds();

    print 'Now we wait this process,'
    print 'While the child process keeps counting'

    time.sleep(3)

    print '3 seconds later:', atimer.get_seconds();

    atimer.stop()

if __name__ == '__main__':
    run()

子プロセスを処理するクラスは次のとおりです。

from multiprocessing import Process, Value

class AsyncTimer():

    def __init__(self):
        self._proc = None
        self._do_count = Value('b',True)
        self._count = Value('i', 0)

    def _count_seconds(self):

        while self._do_count.value:
            self._count.value += 1

    def start(self):
        self._proc = Process(target=self._count_seconds)
        self._proc.start()

    def stop(self):
        self._do_count.value = False
        self._proc.join()

    def get_seconds(self):
        return self._count.value
于 2013-06-12T18:27:16.217 に答える
1

あなたがこれを意図したかどうかはわかりませんが、そうすべきではありません

while can_count.value == 1:
    seconds -= 1
    count_val.value = seconds

あなたのやり方では、ループは決して終了しないと思います。私はまだpythonも学んでいるので、100%確信はありません。

于 2013-06-11T17:52:30.210 に答える