Python 多处理:对特定对象的方法应用 pool.map
Python multiprocessing: apply pool.map on methods of specific objects
以下并行函数执行完美:
来自多处理导入池
来自随机导入 randrange
def triple(number):
return number * 3
if __name__ == '__main__':
numbers = [5, 10, 20]
pool = Pool(processes=3)
print(pool.map(triple, numbers))
但是我如何通过始终在对象列表上调用相同的方法来获得相同的结果,即当函数是某些 class 个对象上的方法时:
from multiprocessing import Pool
from random import randrange
class RandomNumber():
def __init__(self):
self.no = randrange(100)
def triple(self, *args, **kwargs):
print(triple(self.no))
return triple(self.no)
if __name__ == '__main__':
# but how can I always call the same method on an object
numbers = [RandomNumber() for m in range(0, 3)]
# e.g. here on every random number within the list
# call numbers[0].triple(), numbers[1].triple() ...
# paralelly?
问题是我绑定到特定对象,不能只使用函数..
提前致谢!
你可以用函数扭曲这个方法:
def triple_warpper(random_number: RandomNumber):
return random_number.triple()
if __name__ == '__main__':
numbers = [RandomNumber() for m in range(0, 3)]
pool = Pool(processes=3)
print(pool.map(triple_warpper, numbers))
这里有一个使用__call__
方法的方法:
class RandomNumber:
def __call__(self, *args, **kwargs):
r = randrange(100)
return r
if __name__ == '__main__':
r = RandomNumber()
numbers = [x for x in range(0, 10)]
pool = Pool(processes=3)
print(pool.map(r, numbers))
以下并行函数执行完美: 来自多处理导入池 来自随机导入 randrange
def triple(number):
return number * 3
if __name__ == '__main__':
numbers = [5, 10, 20]
pool = Pool(processes=3)
print(pool.map(triple, numbers))
但是我如何通过始终在对象列表上调用相同的方法来获得相同的结果,即当函数是某些 class 个对象上的方法时:
from multiprocessing import Pool
from random import randrange
class RandomNumber():
def __init__(self):
self.no = randrange(100)
def triple(self, *args, **kwargs):
print(triple(self.no))
return triple(self.no)
if __name__ == '__main__':
# but how can I always call the same method on an object
numbers = [RandomNumber() for m in range(0, 3)]
# e.g. here on every random number within the list
# call numbers[0].triple(), numbers[1].triple() ...
# paralelly?
问题是我绑定到特定对象,不能只使用函数..
提前致谢!
你可以用函数扭曲这个方法:
def triple_warpper(random_number: RandomNumber):
return random_number.triple()
if __name__ == '__main__':
numbers = [RandomNumber() for m in range(0, 3)]
pool = Pool(processes=3)
print(pool.map(triple_warpper, numbers))
这里有一个使用__call__
方法的方法:
class RandomNumber:
def __call__(self, *args, **kwargs):
r = randrange(100)
return r
if __name__ == '__main__':
r = RandomNumber()
numbers = [x for x in range(0, 10)]
pool = Pool(processes=3)
print(pool.map(r, numbers))