进程之间共享内存

黑羽

我正在使用python中的多处理模块,尝试并行处理每次循环具有不同增量值的列表的算法(对Eratosthenes算法Sieve的修改)。因此,我希望所有进程之间都有一个共享列表,以便所有进程都在修改同一列表。我已经尝试过使用该multiprocessing.Array函数,但是当我到达程序末尾时,数组仍未修改,仍然包含全0(我将其初始化为的值)。

import multiprocessing
import math

num_cores = multiprocessing.cpu_count()

lower = 0
mark = None

def mark_array(k):
    global mark
    index = (-(-lower//k)*k)-lower
    for i in range(index, len(mark), k):
        mark[i] = 1

def sieve(upper_bound, lower_bound):
    size = upper_bound - lower_bound + 1

    global mark
    mark = multiprocessing.Array('i', size, lock=False)
    for i in range(size):
        mark[i] = 0

    klimit = int(math.sqrt(upper_bound)) + 1
    global lower
    lower = lower_bound

    if __name__ == '__main__':
        pool = multiprocessing.Pool(processes=num_cores)
        inputs = list(range(2, klimit+1))
        pool.map(mark_array, inputs)
        pool.close()
        pool.join()

        result = []
        for i in range(size):
            result.append(mark[i])
        print(result)

sieve(200,100)

请原谅代码。有点混乱,但是我只是想让共享内存在清理之前起作用。

编辑:好的,所以我在Linux机器上尝试了完全相同的代码,然后得到了预期的输出。但是,不能在Windows计算机上的VS代码中运行相同的代码。知道为什么吗?

编辑#2:这似乎是Windows特定的问题,因为Windows操作系统处理进程的方式不同于Linux。如果是这样,有什么办法解决吗?

alex_noname

您可以尝试将multiprocessing.Manager用于任务:

import multiprocessing
import math
from functools import partial

num_cores = multiprocessing.cpu_count()

lower = 0


def mark_array(mark, k):
    index = (-(-lower // k) * k) - lower
    for i in range(index, len(mark), k):
        mark[i] = 1


def sieve(upper_bound, lower_bound):
    size = upper_bound - lower_bound + 1

    klimit = int(math.sqrt(upper_bound)) + 1
    global lower
    lower = lower_bound

    if __name__ == '__main__':
        pool = multiprocessing.Pool(processes=num_cores)
        with multiprocessing.Manager() as manager:
            mark = manager.list(range(size))
            for i in range(size):
                mark[i] = 0

            inputs = list(range(2, klimit + 1))
            foo = partial(mark_array, mark)

            pool.map(foo, inputs)
            pool.close()
            pool.join()

            result = []
            for i in range(size):
                result.append(mark[i])
            print(result)


sieve(200, 100)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Linux上的进程之间共享内存

线程和进程之间共享内存

类属性和进程池中的进程之间共享的内存?

通过使用mmap()在进程之间共享内存

在单独的进程之间共享内存中的复杂python对象

Python如何在多个进程之间共享内存?

两个进程之间的命名共享内存

如何知道两个进程之间的共享内存?

通过共享内存在进程之间共享同步原语是否安全?

python multiprocessing-在进程之间共享类的字典,并将后续从进程反映到共享内存的写入

如何在Linux上使用Ruby 2.0改善独角兽进程之间的内存共享

通过两个进程之间的共享内存发送 int

可以在两个单独的进程之间共享内存中的数据吗?

尝试在客户端-服务器程序中的进程之间创建共享内存段

是否可以在运行flask应用程序的uwsgi进程之间共享内存?

如何使用共享内存而不是通过多个进程之间的酸洗传递对象

如何使用mmap和shm_open在多个独立进程之间共享内存

使用Pytorch在同一GPU上的进程之间共享GPU内存

在Python进程之间共享内存中的大型数据结构?

在资源有限的不同进程之间建立共享内存?

在w3wp进程之间共享程序集以减少内存使用

通过Python中的套接字在两个进程之间传递共享内存对象

预训练 word2vec 模型的进程之间共享内存?

如何在C#和Python进程之间共享字节数组的内存

Directx 12:在两个进程之间共享图形内存

linux内核如何实现2个进程之间的共享内存

使用共享内存在两个进程之间传递套接字描述符

在Python进程之间共享复杂的对象?

在多个进程之间共享结果队列