Google colab: печать в дочерних процессах

#python #printing #google-colaboratory

#python #печать #google-совместная лаборатория

Вопрос:

Я не вижу никаких выходных данных в Google colab, когда я использую python Process . Я пробовал print функцию и logging модуль, но это не работает. Этот простой пример выдает выходные данные на моем компьютере (jupyter notebook, python 3.6.9), но не работает в colab:

 from multiprocessing import Process
import time

def simple_fun(proc_id):
    while True:
        time.sleep(1)
        print(proc_id)
    
N_PROCESS = 2
processes = []
for i in range(N_PROCESS):
    p = Process(target=simple_fun, args=(i,))
    p.start()
    processes.append(p)
  

Могу ли я что-нибудь сделать?

Я что-то упускаю? Может быть, приведенный выше код зависит от платформы?

Ответ №1:

Этот пример процесса работает в Google colab (Python 3.6.9)

 from multiprocessing import Process
import os

def info(title):
    print(title)
    print('module name:', __name__)
    if hasattr(os, 'getppid'):  # only available on Unix
        print( 'parent process:', os.getppid())
    print( 'process id:', os.getpid())

def f(name):
    info('function f')
    print('hello', name)

if __name__ == '__main__':
    info('main line')
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()
  

Комментарии:

1. Это работает, потому что вы добавили p.join() . По какой-то причине print работает в обычном ноутбуке jupyter без join , но не работает в Google colab.

Ответ №2:

Я обнаружил, что это не работает только тогда, когда я не жду процесса с join функцией.

Я не могу заблокировать все процессы сразу.

Но если работа процесса занимает примерно одинаковое количество времени для всех процессов, я могу заблокировать только один процесс:

 from multiprocessing import Process
import time
import logging

def simple_fun(proc_id):
    while True:
        time.sleep(1)
        #logging.info(proc_id)
        print(proc_id)
    
N_PROCESS = 2
processes = []
for i in range(N_PROCESS):
    p = Process(target=simple_fun, args=(i,))
    p.start()
    processes.append(p)

processes[0].join() # <- wait for one of processes
  

Это работает.