0

我一直在尝试了解多处理在 python 中的工作原理,并创建了一个非常简单的脚本来测试我的理解。

一切似乎都工作正常,除了在一个进程中,在 while 循环之后发生的任何值分配似乎都没有完成。

如果我用 for 循环替换 while 循环,或者完全删除它,一切似乎都按预期工作。

这是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

完成后,您需要加入子进程。这是您尝试实现的目标的更清晰示例。请注意与流程相关的所有内容是如何封装到一个类中的?如果您可以通过干净的界面与线程和进程进行交互,它会使处理线程和进程变得更加容易。

这是主要模块

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 回答