我一直在努力学习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
任何想法都表示赞赏。
答案 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