Я использую многопроцессорную обработку с 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?
нет никакого механизма "указателя". Результат, когда я запускаю запрограммируйте ниже:
Поведение почти одинаково на linux, за исключением того, что адрес памяти одинаков для всех экземпляров.
Пожалуйста, кто-нибудь может мне объяснить?