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