2024-09-26 22:54:21 发布
网友
我是新来的意大利人(如果我的英语不太好,请原谅我)。 我是一名计算机科学专业的学生,我正在用Python编写一个并发程序项目。 我们应该使用监视器,一个带有方法和数据(例如条件变量)的类。这个类监视器的一个实例(对象)应该在我们拥有的所有进程中共享(由os.fork操作系统多处理模块)但我们不知道怎么做。线程更简单,因为它们已经共享内存,但我们必须使用进程。有没有办法让这个对象(监视器)可以在所有进程中共享? 希望我不是说无稽之谈…非常感谢大家对巡演的关注。 等待答案。 洛伦佐
至于“共享”实例,我相信讲师希望您将监视器的接口设置为与本地进程的接口,这样就好像它是共享的(la CORBA)。在
看看multiprocessing的^{}的绝妙文档:
multiprocessing
from multiprocessing import Process, Queue def f(q): q.put([42, None, 'hello']) if __name__ == '__main__': q = Queue() p = Process(target=f, args=(q,)) p.start() print q.get() # prints "[42, None, 'hello']" p.join()
您应该能够想象在进行更改时监视器的属性如何在对等进程之间传播。在
进程之间共享内存通常不是一个好主意;当调用os.fork()时,操作系统将父进程使用的和子进程继承的所有内存标记为“写入时复制”;如果任一进程试图修改页,则会将其复制到两个进程之间不共享的新位置。在
os.fork()
这意味着通常的线程原语(锁、条件变量等)不可用于跨进程边界的通信。在
有两种方法可以解决这个问题;首选的方法是使用管道,并序列化两端的通信。布莱恩·凯恩的答案,使用multiprocessing.Queue,就是这样工作的。因为管道没有任何共享状态,并且使用了内核提供的健壮的ipc机制,所以进程不太可能以不一致的状态结束。在
multiprocessing.Queue
另一个选择是以一种特殊的方式分配一些内存,这样操作系统将允许您使用共享内存。最自然的方法是使用mmap。cPython不会为本机python对象使用共享内存,因此您仍然需要整理如何使用这个共享区域。一个合理的库是numpy,它可以将非类型化的二进制内存区域映射到某种有用的数组中。但是,在管理并发性方面,共享内存要难得多;因为没有简单的方法让一个进程知道另一个进程是如何访问共享区域的。这种方法唯一有意义的时候是当少数进程需要共享大量数据时,因为共享内存可以避免通过管道复制数据。在
mmap
至于“共享”实例,我相信讲师希望您将监视器的接口设置为与本地进程的接口,这样就好像它是共享的(la CORBA)。在
看看} 的绝妙文档:
multiprocessing
的^{您应该能够想象在进行更改时监视器的属性如何在对等进程之间传播。在
进程之间共享内存通常不是一个好主意;当调用
os.fork()
时,操作系统将父进程使用的和子进程继承的所有内存标记为“写入时复制”;如果任一进程试图修改页,则会将其复制到两个进程之间不共享的新位置。在这意味着通常的线程原语(锁、条件变量等)不可用于跨进程边界的通信。在
有两种方法可以解决这个问题;首选的方法是使用管道,并序列化两端的通信。布莱恩·凯恩的答案,使用
multiprocessing.Queue
,就是这样工作的。因为管道没有任何共享状态,并且使用了内核提供的健壮的ipc机制,所以进程不太可能以不一致的状态结束。在另一个选择是以一种特殊的方式分配一些内存,这样操作系统将允许您使用共享内存。最自然的方法是使用
mmap
。cPython不会为本机python对象使用共享内存,因此您仍然需要整理如何使用这个共享区域。一个合理的库是numpy,它可以将非类型化的二进制内存区域映射到某种有用的数组中。但是,在管理并发性方面,共享内存要难得多;因为没有简单的方法让一个进程知道另一个进程是如何访问共享区域的。这种方法唯一有意义的时候是当少数进程需要共享大量数据时,因为共享内存可以避免通过管道复制数据。在相关问题 更多 >
编程相关推荐