Почему time.sleep (0) позволяет другому потоку делать что-то при удалении time.sleep, пока не завершится l oop? - PullRequest
0 голосов
/ 18 июня 2020

Я изучаю потоки, и у меня есть одна непонятная вещь.

from threading import Thread
from time import sleep
global a
a=0
def th1():
    lasta=0
    while(a<200):
        if(a!=lasta):
            lasta=a
            print(a) 
thrd=Thread(target=th1)
print(a)
thrd.start()
for i in range (1,200):
    a+=1
    sleep(0)

это печатает числа от 0 до 199, но

from threading import Thread
from time import sleep
global a
a=0
def th1():
    lasta=0
    while(a<200):
        if(a!=lasta):
            lasta=a
            print(a) 
thrd=Thread(target=th1)
print(a)
thrd.start()
for i in range (1,200):
    a+=1

этот код печатает только 0 и 199.

Я думаю, что происходит то, что во втором коде нет (скажем латинских) оператора stop, который заставлял бы программу выполнять другую часть кода, в то время как первый останавливает l oop и дает другому потоку возможность выполнить . затем он проверяет, прошло ли 0 секунд, и продолжает с l oop. Я не знаю, прав ли я, пожалуйста, если бы вы могли помочь мне объяснить, что на самом деле происходит, я был бы рад. также как я могу овладеть такими вещами? например, чтобы непрерывно запускать два потока и позволять им выполнять работу в соответствии с одной глобальной переменной. потому что, как я ясно вижу, даже несмотря на то, что я использую другой поток, они на самом деле не работают вместе, они все еще ждут друг друга

Спасибо!

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Как будут работать несколько потоков, зависит от среды. Потоки не «работают вместе». Они работают в некоторой степени независимо.

На однопроцессорной машине или в программе, которая выполняет несколько потоков на одном процессоре, они никогда не работают одновременно. Каждый поток получает отрезок времени. Он работает в течение фиксированного количества времени (если он не сдается рано, как при сне). Когда его временной отрезок закончен, следующий поток выполняется в течение фиксированного количества времени или до тех пор, пока он не даст результатов. запускается один раз за приращение и будет видеть каждое число.

Во втором примере основной поток выполнит полный временной интервал до того, как потоку th1 будет предоставлено время выполнения. Этого достаточно для многократного цикла l oop в основном потоке. Когда поток th1 снова запускается, он «пропустил» многие значения a.

1 голос
/ 18 июня 2020

Ваш конкретный c вопрос вполне правильный: 0-секундный тайм-аут совершенно отличается от отсутствия оператора. Как вы догадываетесь, это приостанавливает выполнение текущего потока и позволяет другому потоку получить контроль над ЦП.

Если вы используете просто многопоточность, вы получите описанную здесь ситуацию чередования: у вас есть два логических выполнение потоков, но только один логический процессор . Для параллельной обработки необходимо мультиобработка . В сети доступно множество учебных пособий и примеров; просто выполните поиск по запросу «Python руководство по многопроцессорности».

Ваш запрос «как я могу освоить такие вещи?» слишком общий, чтобы быть вопросом переполнения стека. Вы овладеваете этими знаниями по мере того, как овладеваете любыми знаниями: вы находите материалы, соответствующие вашему стилю обучения, прорабатываете эти материалы и практикуетесь.

...