gpt4 book ai didi

python - 多处理奇怪的行为?

转载 作者:行者123 更新时间:2023-12-02 00:47:31 26 4
gpt4 key购买 nike

我正在使用 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

有人可以解释一下吗?

最佳答案

您的基本前提并不完全正确。虽然多个进程确实有自己的内存空间,但这并不意味着它们不能交换数据。

其实程序共享数据有多种机制。这些通常称为“进程间通信”或 IPC。例如;

  • 共享内存
  • 管道
  • 套接字

在幕后,multiprocessing.Queue 使用multiprocessing.Pipe。这反过来又是一个用于操作系统通信管道的 Python 包装器。在 ms-windows 上,这是一个称为命名管道的操作系统原语。在许多其他操作系统上,管道基于文件描述符。

重点是,即使在子进程中继承了 Queue,它们也都连接到相同操作系统对象。这基本上就是他们可以相互交流的原因。

(请注意,这必然是一种简化;如果您真的想知道它是如何工作的,请阅读 multiprocessing 模块 Python 代码。)

关于python - 多处理奇怪的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60590451/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com