python - 实时能力 python 多处理(队列和管道)

标签 python parallel-processing python-multiprocessing

我对测试多处理模块有点困惑。

让我们模拟一个数字计时器。代码如下所示:

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/

相关文章:

python - 顺序排列

python - 阅读擅长工作表,并创建一个DataFrame。语法错误: cannot assign to function call

c - MPI 状态获取错误的发件人

python - 使用 Python 多处理加速从 Postgres 获取大表到 CSV

Python 多进程 Tornado

python - 如何找到 numpy 数组中更大的最近值?

Python:如何使用嵌套枚举作为嵌套它的函数的默认参数?

parallel-processing - 使用 --onall 时,GNU 并行不会在远程服务器上并行运行

java - 我的对象列表应该有多大才能保证使用 java 8 的 parallelStream?

Python 多处理错误 'ForkAwareLocal' 对象没有属性 'connection'