Как вернуть значение из функции, запущенной многопроцессорным процессом - PullRequest
0 голосов
/ 25 октября 2018

Переменная 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 голосов
/ 25 октября 2018

Вы можете использовать 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]
0 голосов
/ 25 октября 2018

Во-первых, вам нужно дождаться ваших процессов.Например, вызовом join.

Во-вторых, process () должен сохранить значение в Child, к которому впоследствии можно получить доступ и вернуть.

...