0

我对编程比较陌生,我要问的可能是一项不可能完成的任务。我想要做的是启动一个并行进程,它将持续运行直到用户请求停止。一旦进程开始,我想从父程序更新并行进程内的局部变量之一,而不停止进程。对于一个非常简单的示例,我要执行的并行过程如下:

import time

def loop(i):
    while 1:
        print i
        i+=1
        time.sleep(1)

其中不断迭代和更新i。为清楚起见,父程序将包含:

from multiprocessing import Process
from loop import loop

i = 1
p = Process(target = loop, args = (i))
p.start()

在父程序中,一旦启动了“循环”,我希望能够将输入“i”更改为另一个数字,并让循环在给定下一个起始值的情况下继续迭代。如果有人对如何做到这一点有任何想法,将不胜感激。

4

3 回答 3

3

您可以使用队列在进程之间传递数据:

from multiprocessing import Process, Queue
from loop import loop

i = 1
q = Queue()
q.put(i)
p = Process(target=loop, args=(q, ))
p.start()

每当您想将 i 的新值传输给其他进程时,只需将其放入队列中即可。

相应地更改您的 loop.py 模块:

def loop(q):
  while True:
    i = q.get()
    print i

在您的主代码中,您可以为流程添加新值:

while True:
  i+=1
  q.put(i)
  time.sleep(1)
于 2013-10-07T19:50:52.530 回答
2

这里的队列没有错,但使用“共享内存”可能更习惯用语。更少的开销。这是一个示例自包含程序:

import time

def loop(i):
    while 1:
        print i.value
        i.value += 1
        time.sleep(1)

if __name__ == "__main__":
    from multiprocessing import Process, Value

    i = Value("i", 1)  # "i" for integer, initial value 1
    p = Process(target=loop, args=(i,))
    p.start()
    for base in range(100, 600, 100):
        time.sleep(2)
        i.value = base

这可能会 ;-) 显示:

1
2
100
101
200
201
300
301
400
401
500
501
502
503
504
505
506
...

但要注意:作为速度更快的回报,这也更脆弱。您可以通过这种方式共享的数据类型基本上继承自 C 语言,并且通常不如 Python 数据类型丰富。在上面的示例中,类型代码"i"意味着我们共享一个有符号 C int,它通常是一个 32 位有符号整数。例如,如果i.value达到 2147483647,我们将其加 1,它会突然变为 -2147483648(是的,负数!)。Python 整数是无界的,但 C 整数不是。

于 2013-10-07T20:48:04.423 回答
0

使用队列。(蟒蛇2是Queue

有几种方法可以从队列中消费。天真的实现(即具有竞争条件的实现)只是做if q.empty(). 这是一种不好的做法,但不会伤害您,因为如果您错过了一个滴答声,这不是关键任务。

更好的方法是使用异常进行流量控制:

q = queue.Queue()
try:
    q.get(False) #non-blocking get()
    #update value of i, etc
except queue.Empty:
    #do stuff here as before
于 2013-10-07T19:57:45.170 回答