这是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
我得到了相同的结果。每个过程完全独立于其他过程(他们不共享记忆并且不需要)。因此,当答案谈到在进程之间共享内存时,这是否意味着在主模块和多处理进程之间?
答案 0 :(得分:1)
您无法使用内置类型在线程之间传输数据。您需要使用multiprocessing.Queue
或mutiprocess.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
在多个进程中调用函数。