Как передать значение из дочернего сценария в родительский сценарий, который выполняется одновременно? - PullRequest
1 голос
/ 21 августа 2011

Возвращать ли значение раньше вызывающему процессу в Python?

Здравствуйте, я хочу спросить, есть ли способ заставить один сценарий вызывать другой сценарий, запустить оба этих сценария одновременно и заставить дочерний сценарий отправлять значение родительскому сценарию задолго до того, как этот дочерний сценарий будет выполнен работает (БЕЗ выхода из этого дочернего сценария рано)? Я ищу решение на Python, но любая информация или подсказки помогут, спасибо.

Я думаю, что один из способов сделать это - напечатать значение, которое вы хотите отправить обратно в родительский скрипт, в стандартный вывод, а затем сделать так, чтобы родительский скрипт перенаправил его или каким-то образом забрал его, но должен быть лучшее решение, потому что, если дочерний скрипт печатает другие вещи? (тогда родительский скрипт должен знать, как изолировать эту точную часть вывода чем-то вроде команд head и tail в Unix, и что, если вы вообще не хотите использовать стандартный вывод?)

Я искал ответы на этот вопрос, но не могу найти ни одного.

Ответы [ 2 ]

3 голосов
/ 21 августа 2011

Вы можете использовать multiprocessing для запуска дочернего скрипта из родительского скрипта. mp.Queue может использоваться для передачи вывода дочернего сценария обратно в родительский. Вот простой пример:

parent.py

import multiprocessing as mp
import child

if __name__ == '__main__':
    queue = mp.Queue()
    proc = mp.Process(target=child.main, args=(queue,))
    proc.daemon = True  
    # This launches the child process, calling child.main()
    proc.start()         
    for i in range(10):
        result = queue.get()  # Get results from child.main
        print(result)

child.py

import time

def main(queue=None):
    for i in range(10):
        # do a computation
        result = i
        if queue:
            # Put a result in the queue for the parent to get
            queue.put(result)   
        time.sleep(.5)

if __name__=='__main__':  
    # We reach here only when child.py is run as a script 
    # (as opposed to child being imported as a module).
    main()  

Обратите внимание, что result, прошедший через queue, должен быть отборным.

1 голос
/ 21 августа 2011

Лучше всего использовать многопроцессорный модуль , который предназначен именно для этой цели.

...