while循环正在将值传递给python进程中的变量

时间:2013-06-11 17:44:53

标签: python-2.6 multiprocess

我一直在努力学习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

任何想法都表示赞赏。

2 个答案:

答案 0 :(得分:1)

我不确定你是否打算这样做,但不应该是

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

你认为,你拥有它的方式,循环永远不会退出。我还在学习python,所以我不是百分百肯定。

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