Многопроцессорное странное поведение? - PullRequest
3 голосов
/ 08 марта 2020

Я использую многопроцессорную обработку с Python для целей тестирования, и есть кое-что, чего я не понимаю.

Априори, процессы имеют свое собственное пространство памяти, поэтому мы не можем совместно использовать класс Python между ними.

Но посмотрите на мой код:

import sys, 
import time
from multiprocessing import Queue, Process

class MainClass():
    def __init__(self, q):
        self.q = q 
        print("Queue in Main", q)

    def start_p(self):
        p = Proc(self.q)
        p.processing()

    def run_p(self):

        p = Process(target=self.start_p, args=())
        p.start()
        return p

class Proc():
    def __init__(self, q):
        self.q = q  

    def processing(self):
        print("Queue in process", self.q)

        n = ''
        try:
            n = self.q.get(0) # Get first item in the "queue"
        except KeyError as e:
            print("NOK", e)

        print("GET: ", n)
        print('Size: ',  self.q.qsize())


if __name__ == "__main__":

    # Creating a queue
    q = Queue()

    # Add 10 numbers in the queue
    for i in range(0,10):
        q.put(i)

    # Add the queue to Main Class
    s = MainClass(q)
    print("Initial queue size", q.qsize())

    # Starting 3 process
    p1 = s.run_p()
    p2 = s.run_p()
    p3 = s.run_p()


    #time.sleep(2)
    print("Final queue size", q.qsize())

Я создал очередь на главном процессе с 10 числами. Затем я запустил 3 процесса, поэтому каждый из них запускал задачу, состоящую из простого (и удаления) первого элемента в очереди.

Что я неправильно понимаю, как эта программа может работать и возвращать итоговую очередь 7? Кажется, очередь является общей ... но сам объект (многопроцессорная обработка) находится в другом месте памяти ... Но в python?

нет никакого механизма "указателя". Результат, когда я запускаю запрограммируйте ниже:

Result

Поведение почти одинаково на linux, за исключением того, что адрес памяти одинаков для всех экземпляров.

l

Пожалуйста, кто-нибудь может мне объяснить?

1 Ответ

2 голосов
/ 08 марта 2020

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

На самом деле существует несколько механизмов обмена программами между программами. Они обычно называются «межпроцессное взаимодействие» или IP C. Например:

  • общая память
  • трубы
  • розетки

Под крышками multiprocessing.Queue используется multiprocessing.Pipe , Это, в свою очередь, оболочка Python для коммуникационной трубы операционной системы . В ms- windows это примитив операционной системы, называемый именованным каналом. Во многих других операционных системах каналы основаны на дескрипторах файлов.

Дело в том, что даже когда очередь наследуется в дочерних процессах, все они связаны с тем же объектом операционной системы. Именно поэтому они могут общаться друг с другом.

(Обратите внимание, что это обязательно упрощение; если вы действительно хотите узнать, как это работает, прочитайте модуль multiprocessing Python код.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...