2

我是新来的,我是意大利人(如果我的英语不太好,请原谅我)。我是一名计算机科学专业的学生,​​我正在使用 Python 进行并发程序项目。我们应该使用监视器,一个带有方法和数据(例如条件变量)的类。此类监视器的实例(对象)应该在我们拥有的所有进程中共享(由 os.fork o 由 multiprocessing 模块创建),但我们不知道该怎么做。线程更简单,因为它们已经共享内存,但我们必须使用进程。有没有办法让这个对象(监视器)在所有进程中共享?希望我不是在胡说八道……非常感谢大家对巡回演出的关注。等待答案。洛伦佐

4

2 回答 2

0

进程之间的共享内存通常不是一个好主意;调用时os.fork(),操作系统将父使用的和子继承的所有内存标记为写时复制;如果任一进程尝试修改页面,则会将其复制到两个进程之间不共享的新位置。

这意味着您通常的线程原语(锁、条件变量等)不能用于跨进程边界进行通信。

有两种方法可以解决这个问题;首选方法是使用管道,并在两端串行化通信。布赖恩凯恩的回答,使用multiprocessing.Queue,以这种确切的方式工作。因为管道没有任何共享状态,并且使用内核提供的强大的 ipc 机制,所以您不太可能最终导致进程处于不一致状态。

另一种选择是以特殊方式分配一些内存,以便操作系统允许您使用共享内存。最自然的方法是使用mmap. 但是,cPython 不会将共享内存用于本机 python 对象,因此您仍然需要理清如何使用此共享区域。一个合理的库是 numpy,它可以将无类型的二进制内存区域映射到某种有用的数组中。但是,在管理并发方面,共享内存更难使用;因为一个进程没有简单的方法可以知道另一个进程如何访问共享区域。这种方法唯一有意义的时候是少数进程需要共享大量数据,因为共享内存可以避免通过管道复制数据。

于 2012-08-04T14:55:28.430 回答
0

就“共享”实例而言,我相信讲师希望您将监视器的接口设置为与其本地进程一样,就好像它是共享的(a la CORBA)。

multiprocessing查看关于's的绝对精彩的文档Queue

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()

您应该能够想象当进行更改时,监视器的属性如何在对等进程之间传播。

于 2012-08-04T14:47:52.330 回答