繁体   English   中英

RawArray 未被进程修改为 Python 多处理的共享内存

[英]RawArray not modified by processes as shared memory for Python multiprocessing

我正在使用 python 多处理。 使用 Pool 启动并发进程和 RawArray 在并发进程之间共享数组。 我不需要同步RawArray的访问,即数组可以随时被任何进程修改。

RawArray 的测试代码是:(不要在意程序的意思,因为它只是一个测试。)

from multiprocessing.sharedctypes import RawArray

import time

sieve = RawArray('i', (10 + 1)*[1])   # shared memory between processes

import multiprocessing as mp

def foo_pool(x):
        time.sleep(0.2)
        sieve[x] = x*x  # modify the shared memory array. seem not work ?    
        return x*x

result_list = []

def log_result(result):  
        result_list.append(result)

def apply_async_with_callback():
        pool = mp.Pool(processes = 4)    
        for i in range(10):
            pool.apply_async(foo_pool, args = (i,), callback = log_result)
        pool.close()
        pool.join()
        print(result_list)  

        for x in sieve:
            print (x)        # !!! sieve is [1, 1, ..., 1]

if __name__ == '__main__':
        apply_async_with_callback()

虽然代码没有按预期工作。 我评论了关键陈述。 我一整天都被困在这个问题上。 任何帮助或建设性的建议将不胜感激。

  • time.sleep失败,因为您没有import time
  • 使用sieve[x] = x*x来修改数组而不是sieve[x].value = x*x
  • 在 Windows 上,您的代码在每个子进程中创建一个新sieve 您需要传递对共享数组的引用,例如:

     def foo_init(s): global sieve sieve = s def apply_async_with_callback(): pool = mp.Pool(processes = 4, initializer=foo_init, initargs=(sieve,)) if __name__ == '__main__': sieve = RawArray('i', (10 + 1)*[1])

您应该使用多线程而不是多处理,因为线程可以本机共享主进程的内存。

如果你担心 python 的 GIL 机制,也许你可以求助于numbanogil

工作版本:

from multiprocessing import Pool, RawArray
import time


def foo_pool(x):
    sieve[x] = x * x  # modify the shared memory array.


def foo_init(s):
    global sieve
    sieve = s


def apply_async_with_callback(loc_size):
    with Pool(processes=4, initializer=foo_init, initargs=(sieve,)) as pool:
        pool.map(foo_pool, range(loc_size))

    for x in sieve:
        print(x)


if __name__ == '__main__':
    size = 50
    sieve = RawArray('i', size * [1])  # shared memory between processes
    apply_async_with_callback(size)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM