Использование класса многопроцессорности Python.Process

Это вопрос новичков:

Класс - это объект, поэтому я могу создать класс с именем pippo() и внутри этой функции добавления и параметра, я не понимаю, выполняются ли функции внутри pippo из-под вниз, когда я назначаю x=pippo() или я должен называть их x.dosomething() вне pippo.

Работа с пакетом многопроцессорности Python, лучше ли определить большую функцию и создать объект с помощью аргумента target в вызове Process() или создать свой собственный класс процесса путем наследования класса Process?

Ответ 1

Я часто задавался вопросом, почему страница документа Python на multiprocessing показывает только "функциональный" подход (используя параметр target). Вероятно, потому что краткие, краткие фрагменты кода лучше всего подходят для иллюстрации. Для небольших задач, которые вписываются в одну функцию, я вижу, как это предпочтительный путь, ala:

from multiprocessing import Process

def f():
    print('hello')

p = Process(target=f)
p.start()
p.join()

Но когда вам нужна большая организация кода (для сложных задач), создание собственного класса - это путь:

from multiprocessing import Process

class P(Process):
    def __init__(self):
        super(P, self).__init__()
    def run(self):
        print('hello')

p = P()
p.start()
p.join()

Помните, что каждый порожденный процесс инициализируется копией объема памяти основного процесса. И что код конструктора (т.е. Материал внутри __init__()) выполняется в основном процессе - только код внутри run() выполняется в отдельных процессах.

Следовательно, если процесс (мастер или порожденный) изменяет его переменную-член, это изменение не будет отражено в других процессах. Это, конечно, справедливо только для типов bulit-in, таких как bool, string, list и т.д. Однако вы можете импортировать "специальные" структуры данных из модуля multiprocessing, которые затем прозрачно распределяются между процессами (см. Обмен состояния между процессами.) Или вы можете создать свои собственные каналы IPC (межпроцессные коммуникации), такие как multiprocessing.Pipe и multiprocessing.Queue.