python并行循环:与外部通信

python并行循环:与外部通信,python,loops,parallel-processing,Python,Loops,Parallel Processing,我正在尝试运行并行循环(免责声明:我对并行处理是新手,这可能是一个相当愚蠢的问题)。 本质上,我希望能够在并行函数中启动和终止循环,并能够不时检查其状态。 我尝试编写一个非常基本的示例(见下文),使用多处理进程和队列,其中启动子函数并开始循环。在每次迭代中,它都会向队列添加一个值,这样就可以与外部通信。但是,我从队列中获得的值是由我请求queue.get()的次数产生的 运行代码,这个问题可能更有意义。 另一种更简单的方法很受欢迎 导入时间 从多处理导入进程,队列 def f(q): z=0 尽

我正在尝试运行并行循环(免责声明:我对并行处理是新手,这可能是一个相当愚蠢的问题)。 本质上,我希望能够在并行函数中启动和终止循环,并能够不时检查其状态。

我尝试编写一个非常基本的示例(见下文),使用多处理进程和队列,其中启动子函数并开始循环。在每次迭代中,它都会向队列添加一个值,这样就可以与外部通信。但是,我从队列中获得的值是由我请求queue.get()的次数产生的

运行代码,这个问题可能更有意义。 另一种更简单的方法很受欢迎

导入时间
从多处理导入进程,队列
def f(q):
z=0
尽管如此:
z=z+1
打印“z”,z
q、 put(['f在z值{}.格式(z)])
睡眠时间(浮动(0.1))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
队列=队列()
进程=进程(目标=f,参数=(队列,)
process.start()
打印“从z值开始:”
打印队列。get()
时间。睡眠(1)
打印“现在f处于z值:”
打印队列。get()
时间。睡眠(1)
打印“以z值终止:”
打印队列。get()
process.terminate()

类是处理状态请求的更好结构,而不是函数。试试这个:

class MyProcess():
  def __init__(self):
    self.state = None

  def start_process(self):
    #manage your state handling here or in an other method.
    self.state = "set state"

p = MyProcess()
queue = Queue()
process = Process(target=p.start_process, args=(queue,)) 
process.start()
print(p.state) #get the state

听起来你想要一份工作

PS您的原始示例不起作用,因为您每次循环时都会向队列中添加一些内容…

您可以使用或从
多处理
到进程之间:

import time
from multiprocessing import Process, Value

def f(v):
    z = 0
    while True:
        z = z+1
        print 'z', z
        v.value = z
        time.sleep(float(0.1))        

if __name__ == '__main__':
    value = Value('i')
    value.value = -1
    process = Process(target=f, args=(value,))
    process.start()
    print 'start with z value:'
    print value.value
    time.sleep(1)

    print 'now f is at z value:'
    print value.value

    time.sleep(1)        
    print 'terminating with z  value:'
    print value.value
    process.terminate()
输出:

start with z value:
-1
z 1
z 2
z 3
z 4
z 5
z 6
z 7
z 8
z 9
z 10
now f is at z value:
10
z 11
z 12
z 13
z 14
z 15
z 16
z 17
z 18
z 19
z 20
terminating with z  value:
20
如中所述,Queue.get()

从队列中删除并返回项目

这意味着它按顺序访问对象:删除第一个对象,然后删除第二个对象,以此类推。。。这种行为是正常的,因为队列使用FIFO(先进先出)

因此,第一次检查队列内容queue.get()时会删除队列中的第一个元素。此时,队列中只有一个元素

第二次检查时,Queue.get()会删除队列中的第二个元素。此时,队列中有9个元素(第一个元素已被删除);但你只能访问第二个

第三次检查队列时,删除了第三个元素,但队列中有18个元素(您已经删除了第一个和第二个元素)

要查看此行为的实际情况,请在检查队列之前添加以下行:

print 'Queue size: {}'.format(queue.qsize())
print queue.get()
问题是,如果要检查进程的当前状态,队列不是这样做的方式,因为它对消息进行排队,所以它不会报告当前状态

print 'Queue size: {}'.format(queue.qsize())
print queue.get()