многопоточность python как функция-член потоков вызывает функции вне класса

#python #multithreading

#python #многопоточность

Вопрос:

Я прочитал следующий пример кода. Что мне интересно, так это то, как функция-член MyThread, run может вызывать функцию, определенную вне класса, MyThread. Нормально ли кодировать таким образом при использовании многопоточности?

 import threading
import time

exitFlag = 0

class myThread (threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):
        print "Starting "   self.name
        print_time(self.name, 5, self.counter)
        print "Exiting "   self.name

def print_time(threadName, counter, delay):
    while counter:
        if exitFlag:
        threadName.exit()
    time.sleep(delay)
    print "%s: %s" % (threadName, time.ctime(time.time()))
    counter -= 1

# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# Start new Threads
thread1.start()
thread2.start()

print "Exiting Main Thread"
  

https://www.tutorialspoint.com/python/python_multithreading.htm

Комментарии:

1. Потоки выполняются в том же пространстве памяти, поэтому они будут иметь доступ ко всем тем же объектам, что и основной поток, включая функциональные объекты. Если бы вы использовали multiprocessing , память не является общей, и дочерний процесс получил бы доступ к функции print_time , используя import * весь файл. Вот почему при использовании процессов вам необходимо использовать if __name__ == "__main__": конструкцию для разделения кода, который вы хотите запускать только в основном потоке (а не при его импорте).

Ответ №1:

На самом деле это не имеет ничего общего с многопоточностью. Вы можете легко придумать пример методов класса, вызывающих функции вне класса

 def func():
    # something

class A:
    def method(self):
        func()
  

В python, когда вы вызываете функцию, она будет искать это имя. Поскольку вы объявили (определили) функцию в глобальном пространстве имен (by def func() ), она находит ее и выполняет. Это просто обычное поведение python, которое не имеет ничего общего с многопоточностью.

Однако, когда дело доходит до того, нормально ли кодировать таким образом, это зависит. Нет ничего ужасного в том, чтобы иметь «глобальную» функцию, которую вы можете вызвать из любого места в этом файле. На самом деле так работает C. Но если вы хотите, чтобы ваш код был более «объектно-ориентированным», вам, вероятно, следует поместить эту функцию в какой-нибудь класс и использовать ее оттуда. Это действительно проблема дизайна или, может быть, обсуждение стиля кодирования.

Ответ №2:

после назначения потоку функции для выполнения она будет ждать запуска вручную, поэтому thread1.start() означает -> вы можете начать сейчас и можете выполнять свою работу.

def run(self):

 print "Starting "   self.name
print_time(self.name, 5, self.counter)
print "Exiting "   self.name
  

Код для выполнения при запуске потока.