当我在Perl中派生一个进程时,子进程可以看到其父进程的数据吗

hc8w905p  于 2023-10-24  发布在  Perl
关注(0)|答案(2)|浏览(172)

假设我正在构建一个网络爬虫,我有一个包含所有访问过的URL的哈希。
当我分叉子进程时,我希望能够从子进程访问访问过的URL的哈希值,但我不想复制哈希值,因为它很大,会耗尽计算机的内存。
当我使用Parallel::ForkManager进行fork并打印在父进程中声明的散列地址时,我从父进程和子进程打印时得到相同的地址,例如HASH(0x7fc59d017f38)
但是我想确保数据结构没有被复制到子进程

ru9i0ody

ru9i0ody1#

不可以。每个进程都有自己的地址空间。子进程的地址空间是父进程地址空间的一个副本,但是更改其中一个地址空间对另一个地址空间没有影响。您需要使用多种可能的通信通道(管道、memcached、数据库、文件等)中的一种来显式地交换您想要“共享”的数据。

ilmyapht

ilmyapht2#

您可以从子进程访问父进程的散列,但不能更新父进程的散列,就像子进程在fork完成后无法看到父进程的任何更新一样。
这是因为两个进程使用相同的虚拟地址空间,但有一个单独的物理地址空间Map,最初作为“写时复制”共享(至少在几乎所有当前的操作系统上)。这意味着那些共享的数据只在RAM中(如果有的话)一次,但是一旦任何子进程的父进程修改了数据,修改后的页面就会被复制。

相关问题