Количество дочерних процессов порождает проблему? - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть следующий код:

import multiprocessing
import os

def info(title):
    print("~"*50)
    print(title)
    print('module name:', __name__)
    print('parent process:', os.getppid())
    print('process id:', os.getpid())

def foo():
    info("foo()")
    print("bar")

if __name__ == '__main__':
    while True:
        p = multiprocessing.Process(target=foo)
        p.start()
        p.join()
        time.sleep(1)

Это работает как шарм за то, что я хочу сделать. Когда я наблюдаю, как выполняются сценарии, значения PID очень высоки.

Пример вывода:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
foo()
module name: __main__
parent process: 1104
process id: 4805
bar
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
foo()
module name: __main__
parent process: 1104
process id: 4806
bar

Тем не менее, PID, видимый через top, не меняется:

 1104 x3         20   0 60060 18252  8560 S  0.7  1.9  0:20.55 │           └─ python3 clockMatrix7219.py
 1109 x3         20   0 60060 18252  8560 S  0.0  1.9  0:00.00 │              ├─ python3 clockMatrix7219.py
 1108 x3         20   0 60060 18252  8560 S  0.0  1.9  0:00.00 │              ├─ python3 clockMatrix7219.py
 1107 x3         20   0 60060 18252  8560 S  0.0  1.9  0:00.00 │              ├─ python3 clockMatrix7219.py
 1106 x3         20   0 60060 18252  8560 S  0.0  1.9  0:00.00 │              └─ python3 clockMatrix7219.py

clockMatrix7219.py - имя сценария.

Мой вопрос: может ли это быть проблематичным в будущем? Будет ли предел? Потому что скрипт предназначен для запуска в любое время. Кроме того, каждый процесс выполняется только в течение доли секунды и завершается после.

Большое спасибо!

1 Ответ

0 голосов
/ 11 апреля 2019

Это получило нулевой ответ, но я понял, как избежать охвата новых процессов каждым циклом.

Я просто поместил while loop внутри функции.

import multiprocessing
import os

def info(title):
    print("~"*50)
    print(title)
    print('module name:', __name__)
    print('parent process:', os.getppid())
    print('process id:', os.getpid())

def foo():
    while True:
        info("foo()")
        print("bar")

if __name__ == '__main__':
    p = multiprocessing.Process(target=foo)
    p.start()
    p.join()
    time.sleep(1)
...