Это все о Python2.7
У меня следующий вопрос:
from futures import ThreadPoolExecutor
def test():
while True:
i = 4
executor = ThreadPoolExecutor(max_workers=2)
executor.submit(test)
executor.submit(test)
Поэтому, когда я запускаю такой код на двухъядерной машине, оба ядра становятся занятыми. Почему это происходит, разве они не должны выполняться, используя только половину ресурсов из-за GIL? Я думаю, что они используют некоторые системные вызовы и поэтому выполняются параллельно, но я не могу понять, какая часть кода выполняется на ядре системы.
вот разобрано:
dis.dis(main)
Disassembly of test:
2 0 SETUP_LOOP 16 (to 19)
>> 3 LOAD_GLOBAL 0 (True)
6 POP_JUMP_IF_FALSE 18
3 9 LOAD_CONST 1 (4)
12 STORE_FAST 0 (i)
15 JUMP_ABSOLUTE 3
>> 18 POP_BLOCK
>> 19 LOAD_CONST 0 (None)
22 RETURN_VALUE
Также следует отметить, что когда я запускаю этот код, я не могу остановить программу, набрав Ctr+C.
Я думаю, это произошло потому, что когда у меня есть 2 ядра и 3 потока (1 основной и 2 потока), после ввода Ctr+C интерпретатор выполняет проверку после каждого тика, и хотя потоки ThreadPool привязаны к процессору и имеют низкий приоритет, основной поток не может получить GIL потому что на другом ядре поток ThreadPool ловит GIL быстрее
Но в моем понимании, где-то основной поток должен получить GIL и остановить программу, а этого не произошло за 5 минут.
Что происходит не так?
python the_script.py
. Теперь я попытался запустить его строки в интерактивном режиме со следующим результатом: Загрузка процессора: 1 ядро, Ctrl-C, Ctrl-D - не работает. Я использую ту же версиюfutures
, я запускаю linux на 2 ядрах, и процесс python показывает загрузку процессора около 60%. - person robyschek   schedule 23.05.2016python the_script.py
, то вы можете остановить выполнение по Ctr+C. Но если вы работаете в интерактивном режиме, вы не можете выйти из интерпретатора, набрав Ctr+D? 60% процессора вы имеете в виду 60% одного ядра или 120%? - person Igor   schedule 23.05.2016top
показывает мне, что 120% 100% ест python, ограниченный GIL, и 20%, я думаю, переключение задач. В отсутствие GIL это было бы 200%. Py3 показывает еще меньше - 100%. - person robyschek   schedule 23.05.2016sys.setcheckinterval(1000000)
в скрипт, загрузка процессора падает со 120% до 100%. - person robyschek   schedule 24.05.2016