Я попытался (безуспешно) распараллелить цикл с использованием многопроцессорности. Вот мой код Python:Многопроцессорность Python - ошибка при использовании нескольких процессов
from MMTK import *
from MMTK.Trajectory import Trajectory, TrajectoryOutput, SnapshotGenerator
from MMTK.Proteins import Protein, PeptideChain
import numpy as np
filename = 'traj_prot_nojump.nc'
trajectory = Trajectory(None, filename)
universe = trajectory.universe
proteins = universe.objectList(Protein)
chain = proteins[0][0]
def calpha_2dmap_mult(t = range(0,len(trajectory))):
dist = []
global trajectory
universe = trajectory.universe
proteins = universe.objectList(Protein)
chain = proteins[0][0]
traj = trajectory[t]
dt = 1000 # calculate distance every 1000 steps
for n, step in enumerate(traj):
if n % dt == 0:
universe.setConfiguration(step['configuration'])
for i in np.arange(len(chain)-1):
for j in np.arange(len(chain)-1):
dist.append(universe.distance(chain[i].peptide.C_alpha,
chain[j].peptide.C_alpha))
return(dist)
dist1 = calpha_2dmap_mult(range(1000,2000))
dist2 = calpha_2dmap_mult(range(2000,3000))
# Multiprocessing
from multiprocessing import Pool, cpu_count
pool = Pool(processes=2)
dist_pool = [pool.apply(calpha_2dmap_mult, args=(t,)) for t in [range(1000,2000), range(2000,3000)]]
print(dist_pool[0]==dist1)
print(dist_pool[1]==dist2)
Если я пытаюсь Pool(processes = 1)
, код работает, как ожидалось, но как только я прошу более одного процесса, код вылетает с этой ошибкой:
python: posixio.c:286: px_pgin: Assertion `*posp == ((off_t)(-1)) || *posp == lseek(nciop->fd, 0, 1)' failed.
Если кто-то есть предложение, то он будет очень признателен ;-)
Благодаря вашим комментариям (@John и @Wynand), я знаю, что можно использовать более одного процесса ... но производительность не улучшилась вообще! Новый скрипт написан в следующем ответе! – guillaume