计算并行函数调用 python
Counting parallel function calls python
我有一个问题,我需要并行调用 class 的实例函数并计算它被调用的次数,以便每次调用都有一个唯一标识符(用于存储结果在一个独特的位置)。
Here is a question with solutions for what I want but in Java
这是一个最小的例子:
para2.py,它设置了所有实例方法酸洗的东西(不太相关):
from copy_reg import pickle
from types import MethodType
from para import func
def _pickle_method(method):
return _unpickle_method, (method.im_func.__name__, method.im_self, method.im_class)
def _unpickle_method(func_name, obj, cls):
return cls.__dict__[func_name].__get__(obj, cls)
pickle(MethodType, _pickle_method, _unpickle_method)
func()
现在 para.py 包含:
from sklearn.externals.joblib import Parallel, delayed
from math import sqrt
from multiprocessing import Lock
class Thing(object):
COUNT = 0
lock = Lock()
def objFn(self, x):
with Thing.lock:
mecount = Thing.COUNT
Thing.COUNT += 1
print mecount
n=0
while n < 10000000:# add a little delay for consistency
n += 1
return sqrt(x)
def func()
thing = Thing()
y = Parallel(n_jobs=4)(delayed(thing.objFn)(i**2) for i in range(10))
print y
现在 运行 python para2.py
在终端打印
0
0
0
0
1
1
1
1
2
2
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
我需要垂直方向上的那些数字来计数 0 到 9,但似乎所有四个进程仍在访问并尝试同时更新 COUNT
。我怎样才能让它做我想做的事?
使用多处理,python 分叉您的代码并创建一个运行代码的子进程。在这样做时,它为每个子进程创建了 class 的副本。它不共享 code/data。您可以通过放置诸如...
之类的打印注释来稍微调试一下
print multiprocessing.current_process().name
在您的构造函数和您的 objFn
中查看 运行 的位置和价值。
为了在进程之间共享数据,您必须从 multiprocessing
库中为此设计一些东西。这些是 Value and Array
个对象。它们使用共享内存,因此通常仅限于整数 ctypes
,而不仅仅是任何通用 python 对象。
我有一个问题,我需要并行调用 class 的实例函数并计算它被调用的次数,以便每次调用都有一个唯一标识符(用于存储结果在一个独特的位置)。
Here is a question with solutions for what I want but in Java
这是一个最小的例子:
para2.py,它设置了所有实例方法酸洗的东西(不太相关):
from copy_reg import pickle
from types import MethodType
from para import func
def _pickle_method(method):
return _unpickle_method, (method.im_func.__name__, method.im_self, method.im_class)
def _unpickle_method(func_name, obj, cls):
return cls.__dict__[func_name].__get__(obj, cls)
pickle(MethodType, _pickle_method, _unpickle_method)
func()
现在 para.py 包含:
from sklearn.externals.joblib import Parallel, delayed
from math import sqrt
from multiprocessing import Lock
class Thing(object):
COUNT = 0
lock = Lock()
def objFn(self, x):
with Thing.lock:
mecount = Thing.COUNT
Thing.COUNT += 1
print mecount
n=0
while n < 10000000:# add a little delay for consistency
n += 1
return sqrt(x)
def func()
thing = Thing()
y = Parallel(n_jobs=4)(delayed(thing.objFn)(i**2) for i in range(10))
print y
现在 运行 python para2.py
在终端打印
0
0
0
0
1
1
1
1
2
2
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
我需要垂直方向上的那些数字来计数 0 到 9,但似乎所有四个进程仍在访问并尝试同时更新 COUNT
。我怎样才能让它做我想做的事?
使用多处理,python 分叉您的代码并创建一个运行代码的子进程。在这样做时,它为每个子进程创建了 class 的副本。它不共享 code/data。您可以通过放置诸如...
之类的打印注释来稍微调试一下print multiprocessing.current_process().name
在您的构造函数和您的 objFn
中查看 运行 的位置和价值。
为了在进程之间共享数据,您必须从 multiprocessing
库中为此设计一些东西。这些是 Value and Array
个对象。它们使用共享内存,因此通常仅限于整数 ctypes
,而不仅仅是任何通用 python 对象。