Python 2.6 当循环中断时,将值传递给python进程中的变量

Python 2.6 当循环中断时,将值传递给python进程中的变量,python-2.6,multiprocess,Python 2.6,Multiprocess,我一直在努力学习python中的多处理是如何工作的,并创建了一个非常简单的脚本来测试我的理解 一切似乎都很正常,除了一个事实,即在一个流程中,在一个while循环之后发生的值赋值似乎都没有完成 如果我用for循环替换while循环,或者完全删除它,那么一切都会按照预期工作 以下是main.py: from timepieces import Stopwatch def run(): watch = Stopwatch() watch.start() can_count

我一直在努力学习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() 
以及timetimes.py文件(包含创建和控制流程的类):


我不知道你是否有意这样做,但这不应该吗

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

我想,按照你的方式,这个循环永远不会退出。我也在学习python,所以我不是100%确定。

当您完成子进程时,您需要加入它。这里有一个更清晰的例子,说明你的目标是什么。注意到与流程相关的所有内容是如何封装到一个类中的吗?如果您可以通过一个干净的接口与线程进行交互,那么处理线程和进程就容易多了

这是主要模块

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

否,因为如果查看main.py,将要求用户输入,并检查该值,然后将0或1值传递到类“can count”变量中,该变量在启动时由类生成的进程共享。整个过程的逻辑都是可怕的,如果你不输入系统正在寻找的单个字符,它将进入一个无限循环;但是,我不认为缺少检查是导致我遇到问题的原因。干杯,但是您将_do_count和_count变量传递给函数,然后通过类引用简单地调用它们,这有什么原因吗?我认为,如果你使用self,你不需要把它作为一个论点来传递。@achillesminor很好。答案是否定的,这是多余的。这只是我的笨拙。我已编辑了我的答案以删除有问题的代码。
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