如何从多进程运行的函数中返回值

时间:2018-10-25 01:23:14

标签: python multiprocess

变量time_completed获得None,而目标是获得完成process函数的时间。如何确保时间返回到parent

import time, multiprocessing

def process():
    num = int()
    while True:
        print '...sleeping %s' % num
        time.sleep(1)
        num += 1
        if num > 10:
            break
    return time.time() 


class Child(object):
    def __init__(self):
        super(Child, self).__init__()

    def process(self):
        proc = multiprocessing.Process(target=process)
        proc.start()

class Parent(object):
    def __init__(self):
        super(Parent, self).__init__()
        child = Child()
        time_completed = child.process()
        print 'time_completed: %s' % time_completed



obj = Parent()

2 个答案:

答案 0 :(得分:1)

您可以使用Pipe或共享内存Value(或类似的Array)在进程之间进行通信。这是使用Pipe的示例:

import multiprocessing as mp

def worker(p):
    msg = 'Hello from child!'
    print("sending {!r} to parent".format(msg))
    p.send(msg)
    v = p.recv()
    print("got {!r} from parent".format(v))

if __name__ == '__main__':
    p_conn, c_conn = mp.Pipe()
    p = mp.Process(target=worker, args=(c_conn,))
    p.start()
    msg = 'Hello from parent!'
    print("got {!r} from child".format(p_conn.recv()))
    print("sending {!r} to child".format(msg))
    p_conn.send(msg)
    p.join()

或者,您可以使用Pool,它在最普遍的情况下需要N令人尴尬的并行工作程序,每个工作程序都具有返回值。 (请注意,我在这里使用multiprocess,它比multiprocessing更加灵活-例如,在解释器中效果更好):

>>> import multiprocess as mp
>>> import time
>>> def process(n):
...     num = int()
...     while True:
...         print '...sleeping %s' % num
...         time.sleep(1)
...         num += 1
...         if num > 10:
...             break
...     return time.time() 
... 
>>> mp.Pool(2).map(process, [None]*2)
...sleeping 0
...sleeping 0
...sleeping 1
...sleeping 1
...sleeping 2
...sleeping 2
...sleeping 3
...sleeping 3
...sleeping 4
...sleeping 4
...sleeping 5
...sleeping 5
...sleeping 6
...sleeping 6
...sleeping 7
...sleeping 7
...sleeping 8
...sleeping 8
...sleeping 9
...sleeping 9
...sleeping 10
...sleeping 10
[1540486371.700522, 1540486371.700522]

答案 1 :(得分:0)

首先,您需要等待您的过程。 例如,通过调用join。

第二,process()应该在Child中存储一个值,该值以后可以访问并返回。