簡體   English   中英

進程間共享 memory

[英]shared memory between processes

我正在使用 python 中的多處理模塊,並嘗試並行化一個算法,該算法每次都以不同的增量值循環遍歷一個列表(修改埃拉托色尼篩算法)。 因此,我希望在所有進程之間有一個共享列表,以便所有進程都在修改同一個列表。 我已經嘗試過使用multiprocessing.Array function,但是當我到達程序末尾時,數組仍然沒有被修改並且仍然包含所有 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)

原諒代碼。 這有點亂,但我只是想在清理它之前讓共享的 memory 工作。

編輯:好的,所以我在 linux 機器上嘗試了完全相同的代碼,我得到了我預期的 output。 但是,在 Windows 機器上的 VS 代碼中運行相同的代碼不會。 知道為什么嗎?

編輯#2:這似乎是 Windows 特定問題,因為 Windows 操作系統處理進程的方式與 Linux 不同。 如果是這種情況,知道如何解決嗎?

您可以嘗試使用 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM