Python:无法通过多处理访问内存

时间:2016-12-18 17:27:05

标签: python python-2.7 multiprocessing python-multiprocessing

这是python包中的python模块:

confirm_email.html.erb

我运行模块并获得如下结果:

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>

int** create_array(int, int);
void fill(int **, int, int);
void print_my_array(int**, int, int);
void print_my_array(int** ,  int  , int );
int main() {

    int **a, x, y;
    printf("Enter x: ");
    scanf("%d", &x);
    printf("Enter y: ");
    scanf("%d", &y);

    a = create_array(x, y);
    fill(a, x, y);
    print_my_array(a, x, y);
    return 0;
}

int** create_array(int rows, int cols) {
    int **arr=NULL,i;
    if (!(arr = (int**)malloc(rows*sizeof(int*)))) {
        printf("Error");
        exit(0);
    }
    for ( i = 0; i <rows; i++){
        if (!(arr[i] = (int*)malloc(cols*sizeof(int)))) {
            printf("Error");
            exit(0);
        }
        return arr;
}
return arr;
}

    void fill(int **arr, int x, int y) {
            //HELP
    }

void print_my_array (int** array,  int x, int y)
{
    int i, j;
    for(i=0;i<x;i++)
    {
        for(j=0;j<y;j++)
        {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

在打印输出中,似乎每个import multiprocessing as mp class Test(object): def __init__(self): self.dict = dict() def fill_dict(self): self.dict = {'testing': 123} print self.dict if __name__ == "__main__": tests = [Test() for i in xrange(3)] jobs = [mp.Process(target=test.fill_dict, args=()) for test in tests] for job in jobs: job.start() for job in jobs: job.join() print "RESULTS:" for test in tests: print test.dict 都由C:\path\to\package>python -m package.path.to.module {'testing': 123} {'testing': 123} {'testing': 123} RESULTS: {} {} {} 并行填充。但是,当我尝试恢复结果时,test.dict似乎是空的。有人可以解释为什么会发生这种情况以及我可以做些什么来恢复非空的multiprocessing

修改 @Valentin Lorentz,@ Moinuddin Quadri,@ zstewart

即使我将模块的后半部分改为

test.dict

我得到了相同的结果。每个过程完全独立于其他过程(他们不共享记忆并且不需要)。因此,当答案谈到在进程之间共享内存时,这是否意味着在主模块和多处理进程之间?

2 个答案:

答案 0 :(得分:1)

您无法使用内置类型在线程之间传输数据。您需要使用multiprocessing.Queuemutiprocess.Pipes来执行此操作。校验: Exchanging objects between processes

您可以参考:Running multiple asynchronous function and get the returned value of each function。它是关于如何使用Queue()而不是list的示例。

答案 1 :(得分:1)

默认情况下,进程不共享内存。这是故意的,因为在执行线程之间共享内存是一个非常复杂的主题(线程,通信之间的同步......)

您问题的最直接解决方案是明确地分享此对象:https://docs.python.org/3/library/multiprocessing.html#sharing-state-between-processes

但是,更简洁的方法是让函数返回结果,并使用multiprocessing.Pool.map在多个进程中调用函数。