Объединение потоков в Python

Опубликовано: 12 Апреля, 2022

Подобно запуску нескольких независимых программ одновременно, одновременное выполнение нескольких потоков также имеет аналогичные функции с некоторыми дополнительными преимуществами, а именно:

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

Многопоточность определяется как возможность выполнять несколько потоков одновременно или одновременно. Следовательно, в одном процессе может существовать более одного потока, где:

  • Набор регистров и локальные переменные каждого потока хранятся в стеке.
  • Глобальные переменные (хранящиеся в куче) и программные коды используются всеми потоками.

Способы соединения потоков

При вызове метода join () вызывающий поток блокируется до тех пор, пока объект потока (на котором вызывается поток) не будет завершен. Объекты потока могут завершаться при любом из следующих условий:

  • Либо нормально.
  • Через некорректно обработанное исключение.
  • Пока не наступит необязательный тайм-аут.

Следовательно, метод join () указывает ожидание завершения потока. Мы также можем указать значение тайм-аута для метода join (). В такой ситуации вызывающий поток может попросить поток остановиться, послав сигнал через объект события. Метод join () можно вызывать несколько раз.

Синтаксис:

object_name.join()
OR
object_name.join(timeout) 
where timeout argument is the timeout value.

Example:

Python3

from threading import Thread
from threading import Event
import time
   
  
class Connection(Thread):
   
    StopEvent = 0
      
    def __init__(self,args):
        Thread.__init__(self)
        self.StopEvent = args
  
    # The run method is overridden to define 
    # the thread body 
    def run(self):
   
        for i in range(1,10):
            if(self.StopEvent.wait(0)):
                print ("Asked to stop")
                break;
   
            print("The Child Thread sleep count is %d"%(i))
            time.sleep(3)
          
        print ("A Child Thread is exiting")
  
Stop = Event()
Connection = Connection(Stop)           
Connection.start()
print("Main thread is starting to wait for 5 seconds")
   
Connection.join(5
print("Main thread says : I cant"t wait for more than 5
seconds for the child thread; Will ask child thread to stop")
   
# ask(signal) the child thread to stop
Stop.set()
   
# wait for the child thread to stop
Connection.join()
   
print("Main thread says : Now I do something else to compensate
the child thread task and exit")
print("Main thread is exiting")

Выход:

The Child Thread sleep count is 1
Main thread is starting to wait for 5 seconds
The Child Thread sleep count is 2
Main thread says : I cant’t wait for more than 5 seconds for the child thread;
Will ask child thread to stop
Asked to stop
A Child Thread is exiting
Main thread says : Now I do something else to compensate the child thread task and exit
Main thread is exiting

Что следует помнить при объединении потоков с помощью join () в Python:

  • Ошибка времени выполнения возникает, когда метод join () вызывается в том же потоке, что и вызов join () в том же потоке, что приводит к состоянию взаимоблокировки.
  • Если метод join () вызывается в потоке, который еще не запущен, возникает ошибка времени выполнения.
  • Если join () имеет аргумент тайм-аута, тогда это должно быть число с плавающей запятой, представляющее время работы потока в секундах.
  • Если у метода join () нет аргументов, блокируется до тех пор, пока поток не завершит операцию.
  • Поскольку значение, возвращаемое функцией join (), всегда равно None, мы всегда должны использовать isAlive () сразу после join (), чтобы проверить, активен ли поток или нет.

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.