多处理冻结计算机
multiprocessing freeze computer
我通过使用多处理改进了我的执行时间,但我不确定 PC 的行为是否正确,它会冻结系统,直到所有进程完成。
我正在使用 Windows 7 和 Python 2.7.
也许我做错了,这是我做的:
def do_big_calculation(sub_list, b, c):
# do some calculations here with the sub_list
if __name__ == '__main__':
list = [[1,2,3,4], [5,6,7,8], [9,10,11,12]]
jobs = []
for sub_l in list :
j = multiprocessing.Process(target=do_big_calculation, args=(sub_l, b, c))
jobs.append(j)
for j in jobs:
j.start()
在这里,您正在为每个任务创建 1 个 Process
。这将 运行 您的所有任务并行进行,但它会给您的计算机带来沉重的开销,因为您的调度程序将需要管理许多进程。这可能会导致系统冻结,因为您的程序使用了太多资源。
此处的解决方案可能是使用 multiprocessing.Pool
到 运行 给定数量的进程同时执行某些任务:
import multiprocessing as mp
def do_big_calculation(args):
sub_list, b, c = args
return 1
if __name__ == '__main__':
b, c = 1, 1
ll = [([1, 2, 3, 4], b, c),
([5, 6, 7, 8], b, c),
([9, 10, 11, 12], b, c)]
pool = mp.Pool(4)
result = pool.map(do_big_calculation, ll)
pool.terminate()
print(result)
如果你准备好使用第三方库,你也可以看看concurrent.futures
(you need to install it in python2.7 but it exists for python3.4+) or joblib
(pip可用):
from joblib import Parallel, delayed
def do_big_calculation(sub_list, b, c):
return 1
if __name__ == '__main__':
b, c = 1, 1
ll = [([1, 2, 3, 4], b, c),
([5, 6, 7, 8], b, c),
([9, 10, 11, 12], b, c)]
result = Parallel(n_jobs=-1)(
delayed(do_big_calculation)(l, b, c) for l in ll)
print(result)
此类库的主要优点是它正在开发中,而 python2.7 中的 multiprocessing
已冻结。因此,错误修复和改进相对频繁。
它还实现了一些巧妙的工具来减少计算开销。例如,它对大 numpy 数组使用内存映射(减少启动所有作业的内存占用)。
我通过使用多处理改进了我的执行时间,但我不确定 PC 的行为是否正确,它会冻结系统,直到所有进程完成。 我正在使用 Windows 7 和 Python 2.7.
也许我做错了,这是我做的:
def do_big_calculation(sub_list, b, c):
# do some calculations here with the sub_list
if __name__ == '__main__':
list = [[1,2,3,4], [5,6,7,8], [9,10,11,12]]
jobs = []
for sub_l in list :
j = multiprocessing.Process(target=do_big_calculation, args=(sub_l, b, c))
jobs.append(j)
for j in jobs:
j.start()
在这里,您正在为每个任务创建 1 个 Process
。这将 运行 您的所有任务并行进行,但它会给您的计算机带来沉重的开销,因为您的调度程序将需要管理许多进程。这可能会导致系统冻结,因为您的程序使用了太多资源。
此处的解决方案可能是使用 multiprocessing.Pool
到 运行 给定数量的进程同时执行某些任务:
import multiprocessing as mp
def do_big_calculation(args):
sub_list, b, c = args
return 1
if __name__ == '__main__':
b, c = 1, 1
ll = [([1, 2, 3, 4], b, c),
([5, 6, 7, 8], b, c),
([9, 10, 11, 12], b, c)]
pool = mp.Pool(4)
result = pool.map(do_big_calculation, ll)
pool.terminate()
print(result)
如果你准备好使用第三方库,你也可以看看concurrent.futures
(you need to install it in python2.7 but it exists for python3.4+) or joblib
(pip可用):
from joblib import Parallel, delayed
def do_big_calculation(sub_list, b, c):
return 1
if __name__ == '__main__':
b, c = 1, 1
ll = [([1, 2, 3, 4], b, c),
([5, 6, 7, 8], b, c),
([9, 10, 11, 12], b, c)]
result = Parallel(n_jobs=-1)(
delayed(do_big_calculation)(l, b, c) for l in ll)
print(result)
此类库的主要优点是它正在开发中,而 python2.7 中的 multiprocessing
已冻结。因此,错误修复和改进相对频繁。
它还实现了一些巧妙的工具来减少计算开销。例如,它对大 numpy 数组使用内存映射(减少启动所有作业的内存占用)。