如何在 python3 中正确设置多处理
How to properly set up multiprocessing in python3
我正在尝试使用 Python 3.6 多处理一个高度并行化的问题。该问题涉及一个 class ,它在实例化时传递了一个数组。其中一个成员函数遍历数组并处理数据,然后将其写入另一个列表。我有一个带有传统串行计算的问题的简化版本;但是,我对多处理示例有点迷茫。我正在尝试创建 2 个进程,一个将从 0 迭代到 4,另一个从 5 迭代到输入列表的长度(即 8)。我不知道我是否正确设置了进程,此外我不确定如何正确加入线程。我不确定这是否应该涉及 Que 或 daeman,如有任何帮助,我们将不胜感激。
from multiprocessing import Process
class Test:
def __init__(self, array_list):
self.array_list = array_list
def func(self, names):
return 'Test' + names
def iterate(self, upper, lower):
output = [self.func(self.array_list[i]) for i in range(lower, upper)]
return output
if __name__ == "__main__":
# Serial method
test_list = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
obj1 = Test(test_list)
results = obj1.iterate(len(test_list), 0)
print(results)
# Attempt at multiprocessed method (Im lost at this point!)
p = []
p[0] = Process(target=obj1.iterate, args=(4, 0, ))
p[1] = Process(target=obj1.iterate, args=(8, 5, ))
此示例使用队列将数据从进程传回主进程。
from multiprocessing import Queue, Process
class Test:
def __init__(self, array_list):
self.array_list = array_list
def func(self, names):
return 'Test' + names
def iterate(self, upper, lower):
output = [self.func(self.array_list[i]) for i in range(lower, upper)]
return output
if __name__ == "__main__":
# Serial method
test_list = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
obj1 = Test(test_list)
results = obj1.iterate(len(test_list), 0)
print(results)
def run_and_send_back_output(queue, func, *args):
result = func(*args) # run the func
queue.put(result) # send the result back
q = Queue()
p1 = Process(
target=run_and_send_back_output,
args=(q, obj1.iterate, 4, 0)
)
p1.start()
p2 = Process(
target=run_and_send_back_output,
args=(q, obj1.iterate, 8, 4)
)
p2.start()
p1.join()
p2.join()
results = []
while not q.empty():
results.extend(q.get())
print(results)
我正在尝试使用 Python 3.6 多处理一个高度并行化的问题。该问题涉及一个 class ,它在实例化时传递了一个数组。其中一个成员函数遍历数组并处理数据,然后将其写入另一个列表。我有一个带有传统串行计算的问题的简化版本;但是,我对多处理示例有点迷茫。我正在尝试创建 2 个进程,一个将从 0 迭代到 4,另一个从 5 迭代到输入列表的长度(即 8)。我不知道我是否正确设置了进程,此外我不确定如何正确加入线程。我不确定这是否应该涉及 Que 或 daeman,如有任何帮助,我们将不胜感激。
from multiprocessing import Process
class Test:
def __init__(self, array_list):
self.array_list = array_list
def func(self, names):
return 'Test' + names
def iterate(self, upper, lower):
output = [self.func(self.array_list[i]) for i in range(lower, upper)]
return output
if __name__ == "__main__":
# Serial method
test_list = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
obj1 = Test(test_list)
results = obj1.iterate(len(test_list), 0)
print(results)
# Attempt at multiprocessed method (Im lost at this point!)
p = []
p[0] = Process(target=obj1.iterate, args=(4, 0, ))
p[1] = Process(target=obj1.iterate, args=(8, 5, ))
此示例使用队列将数据从进程传回主进程。
from multiprocessing import Queue, Process
class Test:
def __init__(self, array_list):
self.array_list = array_list
def func(self, names):
return 'Test' + names
def iterate(self, upper, lower):
output = [self.func(self.array_list[i]) for i in range(lower, upper)]
return output
if __name__ == "__main__":
# Serial method
test_list = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
obj1 = Test(test_list)
results = obj1.iterate(len(test_list), 0)
print(results)
def run_and_send_back_output(queue, func, *args):
result = func(*args) # run the func
queue.put(result) # send the result back
q = Queue()
p1 = Process(
target=run_and_send_back_output,
args=(q, obj1.iterate, 4, 0)
)
p1.start()
p2 = Process(
target=run_and_send_back_output,
args=(q, obj1.iterate, 8, 4)
)
p2.start()
p1.join()
p2.join()
results = []
while not q.empty():
results.extend(q.get())
print(results)