python并行循环:与outsid通信

2024-04-26 03:55:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

运行代码,问题可能会更有意义。 另一种更简单的方法很受欢迎。你知道吗

import time
from multiprocessing import Process, Queue

def f(q): 
    z = 0
    while True:
        z = z+1
        print 'z', z
        q.put(['f is at z value {}'.format(z)])
        time.sleep(float(0.1))        

if __name__ == '__main__':
    queue = Queue()
    process = Process(target=f, args=(queue,)) 
    process.start()
    print 'start with z value:'
    print queue.get()
    time.sleep(1)

    print 'now f is at z value:'
    print queue.get()

    time.sleep(1)        
    print 'terminating with z  value:'
    print queue.get()    
    process.terminate()

Tags: 函数importgettime队列queueisvalue
3条回答

可以在进程之间使用^{}^{}multiprocessingshare the state

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

听起来你想要一个shared Value

import time
from multiprocessing import Process, Value

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

if __name__ == '__main__':
    z = Value('i', 0)

    process = Process(target=f, args=(z,)) 
    process.start()
    print 'start with z value:', z.value
    time.sleep(1)

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

    time.sleep(1)        
    print 'terminating with z  value:', z.value

    process.terminate()

PS您原来的示例不起作用,因为您每次循环时都会向队列中添加一些内容。。。你知道吗

queue guide中所述,队列.get()

Remove and return an item from the queue.

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

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

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

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

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

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

问题是,如果您想检查进程的当前状态,队列不是这样做的方法,因为它排队等待消息,所以它不报告当前状态。你知道吗

相关问题 更多 >