Python - 如何将全局变量传递给multiprocessing.Process?

时间:2015-01-22 10:08:29

标签: python process global-variables multiprocessing python-multiprocessing

我需要在一段时间后终止某些进程,所以我已经使用了另一个进程来等待。但是我认为新流程无法从主流程访问全局变量。我怎么能解决它?

代码:

import os
from subprocess import Popen, PIPE
import time
import multiprocessing


log_file = open('stdout.log', 'a')
log_file.flush()

err_file = open('stderr.log', 'a')
err_file.flush()

processes = []


def processing():
    print "processing"
    global processes
    global log_file
    global err_file

    for i in range(0, 5):
        p = Popen(['java', '-jar', 'C:\\Users\\two\\Documents\\test.jar'], stdout=log_file, stderr=err_file) # something long running
        processes.append(p)
    print len(processes)    # returns 5

def waiting_service():
    name = multiprocessing.current_process().name
    print name, 'Starting'
    global processes
    print len(processes)    # returns 0

    time.sleep(2)

    for i in range(0, 5):
        processes[i].terminate()
    print name, 'Exiting'

if __name__ == '__main__':
    processing()

    service = multiprocessing.Process(name='waiting_service', target=waiting_service)

    service.start()

2 个答案:

答案 0 :(得分:2)

您应该使用synchronization primitives

可能你想设置一个由主(父)过程在一段时间后触发的Event

您可能还想等待进程实际完成并join它们(就像您在线程中一样)。

如果您有许多类似的任务,可以使用像multiprocessing.Pool这样的处理池。

以下是一个小例子:

import multiprocessing
import time

kill_event = multiprocessing.Event()

def work(_id):
    while not kill_event.is_set():
        print "%d is doing stuff" % _id
        time.sleep(1)
    print "%d quit" % _id

def spawn_processes():
    processes = []

    # spawn 10 processes
    for i in xrange(10):
        # spawn process
        process = multiprocessing.Process(target=work, args=(i,))
        processes.append(process)
        process.start()
        time.sleep(1)

    # kill all processes by setting the kill event
    kill_event.set()

    # wait for all processes to complete
    for process in processes:
        process.join()

    print "done!"
spawn_processes()

答案 1 :(得分:1)

整个问题出现在Windows'蟒蛇。 Python for Windows阻止了在函数中看到的全局变量。我已切换到linux,我的脚本运行正常。

特别感谢@rchang的评论:

  

当我测试它时,在两种情况下,print语句都出现了5.也许我们在某种程度上存在版本不匹配?我在Linux内核3.13.0(Mint发行版)上使用Python 2.7.6进行了测试。