我对测试多处理模块有点困惑。
让我们模拟一个数字计时器。代码如下所示:
start=datetime.now()
while True:
now=datetime.now()
delta=now-start
s = delta.seconds + delta.microseconds/1E6
print s
time.sleep(1)
哪个正确返回:
8e-06
1.001072
2.00221
3.003353
4.004416
...
现在我想使用管道从我的虚拟外部数字时钟设备读取时钟:
def ask_timer(conn):
start=datetime.now()
while True:
now=datetime.now()
delta=now-start
s = delta.seconds + delta.microseconds/1E6
conn.send(s)
parent_conn, child_conn = Pipe()
p = Process(target=ask_timer, args=(child_conn,))
p.start()
while True:
print parent_conn.recv()
time.sleep(1)
它返回:
2.9e-05
6.7e-05
7.7e-05
8.3e-05
8.9e-05
9.4e-05
0.0001
...
这里的计时器似乎并没有在后台永久运行。“队列”的实现如下所示:
def ask_timer(q):
while True:
now=datetime.now()
delta=now-start
s = delta.seconds + delta.microseconds/1E6
q.put(s)
#conn.close()
q = Queue()
p = Process(target=ask_timer, args=(q,))
p.start()
while True:
print q.get()
time.sleep(1)
和管道一样。这只是我对 python 多处理的误解吗?我怎么能从正在运行的并行线程中实时询问一个值?
最佳答案
一切正常。子进程完全独立于主进程执行 ask_timer()
函数。您在此函数中没有任何 time.sleep()
,因此它只是在无限循环中以 10 毫秒的间隔打印或放入队列增量。
您的主进程每秒向子进程请求数据并获取数据。数据是那些小间隔之一。
问题是你将更多的数据放入管道/队列,而不是从中取出。因此,当您询问时,您得到的是旧数据。要测试您是否可以在循环中打印队列大小(不适用于 OS X):
def ask_timer(q):
start = datetime.now()
while True:
now = datetime.now()
delta = now - start
s = delta.seconds + delta.microseconds / 1E6
q.put(s)
q = Queue()
p = Process(target=ask_timer, args=(q,))
p.start()
while True:
print q.get()
print q.qsize()
time.sleep(1)
队列大小会增长得非常快。
显然你可以使用 shared memory从子进程中读取当前值。
from multiprocessing import Process, Value
from datetime import datetime
import time
from ctypes import c_double
def ask_timer(v):
start = datetime.now()
while True:
now = datetime.now()
delta = now - start
s = delta.seconds + delta.microseconds / 1E6
v.value = s
val = Value(c_double, 0.0)
p = Process(target=ask_timer, args=(val,))
p.start()
while True:
print(val.value)
time.sleep(1)
关于python - 实时能力 python 多处理(队列和管道),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33019201/