Влияние time.sleep на доступ к потокам - PullRequest
0 голосов
/ 17 января 2019

В Python у меня есть многопоточное приложение, которое обращается к глобальному объекту. Любопытно, если я помещу time.sleep () в поток (скажем, THREAD 1), который собирается получить доступ к глобальному объекту, time.sleep () задерживает доступ THREAD 1 к глобальному объекту так, что другие потоки, которые этого не делают У time.sleep () есть возможность сначала получить доступ к глобальному объекту?

1 Ответ

0 голосов
/ 17 января 2019

В Python потоки довольно сложны и работают в одной и той же куче памяти. Потоки в основном работают одновременно, то есть несколько потоков чередуются вместе, так что только при запуске выполняется одновременно, и они вместе работают альтернативно в очень короткие промежутки времени (учитывая, что им нужен доступ к интерпретатору).

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

Как только THREAD1 активизируется, при необходимости он получит GIL и, таким образом, получит доступ к глобальной переменной. Так как он снова чередуется с другими потоками, из-за параллелизма он получает немедленный доступ к глобальной переменной после активации. Если бы другие потоки использовали его, они бы отказались от доступа до того, как THREAD1 начал операции.

...