Я написал простой скрипт на Python для проверки перекрытия между потоками, связанными с вводом-выводом и процессором.Код здесь:
from datetime import datetime
import threading
import shutil
import os
def cpuJob(start,end):
counter=start
sum=0
while counter<=end:
sum+=counter
counter+=1
return sum
def ioJob(from_path, to_path):
if os.path.exists(to_path):
shutil.rmtree(to_path)
shutil.copytree(from_path, to_path)
startTime=datetime.now()
Max=120000000
threadCount=2
if threadCount==1:
t1 = threading.Thread(target=cpuJob, args=(1,Max))
# t1 = threading.Thread(target=ioJob, args=(1,Max))
t1.start()
t1.join()
else:
t1 = threading.Thread(target=ioJob, args=("d:\\1","d:\\2"))
t2 = threading.Thread(target=cpuJob, args=(1,Max))
t1.start()
t2.start()
t1.join()
t2.join()
endTime=datetime.now()
diffTime = endTime - startTime
print("Execution time for " , threadCount , " threads is: " , diffTime)
Если я запускаю потоки отдельно (threadCount == 1), каждый поток занимает около 12-13 секунд на моем ноутбуке с Windows.Но когда я запускаю их вместе (threadCount == 2), это занимает около 20-22 секунд.Насколько я знаю, Python выпускает GIL перед выполнением каких-либо блокирующих операций ввода-вывода.Если GIL выпускается до работы с вводом / выводом, почему я получаю такую производительность в коде?
Редактировать 1: Как было предложено в комментариях, я проверил код shutils
,Похоже, что при реализации этого пакета GIL не выпускается.Почему это так?Код пакета утилит оболочки должен выходить за пределы реализации Python, не так ли?