У меня есть код, который использует Pool
из модуля multiprocessing
Python. Производительность - это не то, что я ожидаю, и хотел бы прокомментировать код, чтобы выяснить, что происходит. Проблема, с которой я столкнулась, заключается в том, что выход профилирования перезаписывается для каждой работы, и я не могу накопить разумное количество статистических данных.профилирование пула многопроцессорности python
Например, с:
import multiprocessing as mp
import cProfile
import time
import random
def work(i):
x = random.random()
time.sleep(x)
return (i,x)
def work_(args):
out = [None]
cProfile.runctx('out[0] = work(args)', globals(), locals(),
'profile-%s.out' % mp.current_process().name)
return out[0]
pool = mp.Pool(10)
for i in pool.imap_unordered(work_, range(100)):
print(i)
Я только получить статистику по «последней» работу, которая не может быть наиболее вычислительно требуют один. Я полагаю, что мне нужно хранить статистику где-то, а затем записывать их только тогда, когда пул очищается.
проблема заключается в том, что 'runctx' перезаписывает выход на каждом вызове, поскольку он выполняется несколько раз, вы получите только«последний» работа для каждого процесса - собирать сообщение полурабочее решение –
ah ok - все написано за каждый процесс - почему бы просто не добавить временную метку? – scytale
, потому что у меня есть * много * рабочих мест, выполняемых в реальной жизни, и я не хочу, чтобы миллионы небольших файлов профиля –