#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
Код для выполнения при запуске потока.