Функция запуска Python параллельно основному коду - PullRequest
2 голосов
/ 07 мая 2019

У меня есть следующий код (Python 3.7 в Windows 64bit):

from time import sleep
import time
from multiprocessing import Process

### function ###
def func(l):

     for i in l:
         sleep(1)
         print (i)
         t1 = time.time()
         total = t1-t0
         print ('time : ',total)


### main code ###
t0 = time.time()
l = list(range(1, 4))

if __name__ == '__main__':
     p = Process(target=func, args=(l,))
     p.start()
     p.join()

sleep(10)
print ('done')

t1 = time.time()
total = t1-t0
print ('time : ',total)

Цель - запустить функцию параллельно с основным блоком кода. Когда я запускаю это, я получаю следующий результат:

done
time :  10.000610828399658
1
time :  11.000777244567871
2
time :  12.001059532165527
3
time :  13.00185513496399
done
time :  23.11873483657837

Однако я ожидал следующего:

1
time: ~1
2
time: ~2
3
time: ~3
done
time: ~10

Поэтому я хочу, чтобы функция работала параллельно с основным кодом. Я в замешательстве, потому что без многопроцессорной обработки этот код должен выполняться не более 13 секунд, а он - 23. Цель - запустить его за 10 секунд.

Как это исправить, чтобы она работала как положено?

1 Ответ

1 голос
/ 07 мая 2019

Я не могу воспроизвести проблему, когда в первый раз напечатано ~ 10, при попытке получить время, начиная с ~ 1, как и ожидалось.

Мое последнее время от родительского процесса ~ 13. Это из-за p.join(), который ожидает завершения дочернего процесса. Если я уберу это, время, напечатанное в родительском элементе, будет ~ 10.

Сценарий:

from time import sleep
import time
from multiprocessing import Process

### function ###
def func(l):

     for i in l:
         sleep(1)
         print (i)
         t1 = time.time()
         total = t1-t0
         print ('time : ',total)


### main code ###
t0 = time.time()
l = list(range(1, 4))

if __name__ == '__main__':
     p = Process(target=func, args=(l,))
     p.start()
     # p.join()

sleep(10)
print ('done')
t1 = time.time()
total = t1-t0
print ('time : ',total)

Выход:

$ python testmultiproc.py 
1
time :  1.0065689086914062
2
time :  2.0073459148406982
3
time :  3.0085067749023438
done
time :  10.008337020874023
...