簡體   English   中英

如何在python進程中獲取多處理數組

[英]How to get multiprocessing Array in python process

我想在每個進程中訪問“ gs”變量。 如何從過程中引用initargs?

# file exec.py
import time
import os
import random


def f(letter):
    sleep_time = random.randint(3, 20)
    pid = os.getppid()
    g_id = # gs.pop() (how to access gs?)
    print('-------\nsleep: {}\npid: {}\nletter: {}'.format(sleep_time, pid, letter))
    time.sleep(sleep_time)
    print('===========\n{} ended\n==========='.format(letter))

    # gs.add(g_id) (return g_id so it can be used by others)
    return letter

這是主文件:

from multiprocessing import Pool, TimeoutError, Array

# file main.py
if __name__ == '__main__':
    gs = Array('B', [66, 67, 68, 69], lock=False)
    pool = Pool(processes=4, initargs=(gs, ))

    hopts = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']

    pool.map(f, hopts)

您缺少的關鍵是需要使用pool初始化參數。 這個答案是一個很好的例子,說明了如何做到這一點以及為什么需要那樣做。

這是將此類工作流程應用於您的問題的示例:

from multiprocessing import Pool, Array
import time
import os
import random

def f(letter):
    sleep_time = random.randint(3, 20)
    pid = os.getppid()
    g_id = gs[0]
    print('-------\nsleep: {}\npid: {}\nletter: {}'.format(sleep_time, pid, letter))
    time.sleep(sleep_time)
    print('===========\n{} ended\n==========='.format(letter))

    # gs.add(g_id) (return g_id so it can be used by others)
    return letter

def init(local_gs):
    global gs
    gs = local_gs

if __name__ == '__main__':
    gs = Array('B', [66, 67, 68, 69], lock=False)
    pool = Pool(initializer=init, initargs=(gs,))

    hopts = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
    pool.map(f, hopts)

(我不確定您的最終目標是什么,因此我嘗試盡可能少地進行修改。)

暫無
暫無

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

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