Использование потока Python в качестве простого объекта

python multithreading

28 просмотра

2 ответа

Если я определяю поток Python, расширяющий потоки. Класс Thread и переопределяющий прогон, я могу затем вызвать run () вместо start () и использовать его в потоке вызывающего абонента вместо отдельного.

т.е.

class MyThread(threading.thread):
    def run(self):
        while condition():
            do_something()

этот код (1) будет выполнять метод "запустить" это в отдельном потоке

t = MyThread()
t.start()

этот код (2) выполнит метод run в текущем потоке

t = MyThread()
t.run()

Есть ли практические недостатки в использовании этого подхода при написании кода, который может быть выполнен любым способом? Может ли непосредственный вызов «запуска» объекта Thread вызвать проблемы с памятью, проблемы с производительностью или другое непредсказуемое поведение?

Другими словами, каковы различия (если они заметны, я думаю, что будет выделено больше памяти , но это должно быть незначительно) между вызовом кода (2) в классе MyThread и другим идентичным классом, который расширяет «объект» вместо «многопоточность» .Tread»

Я предполагаю, что некоторые (если таковые имеются) из более низких различий уровня могут зависеть от переводчика. Если это актуально, я в основном заинтересован в CPython 3. *

Автор: Riccardo Cagnasso Источник Размещён: 08.11.2019 11:14

Ответы (2)


1 плюс

Не будет разницы в поведении, runкогда вы используете threading.Threadобъект, или объект threading.Threadподкласса, или объект любого другого класса, у которого есть runметод:

threading.Thread.startзапускает новый поток, а затем запускается runв этом.

runзапускает активность в вызывающем потоке , будь то основной поток или другой.

Если вы работаете runв основном потоке, весь поток будет занят выполнением задачи run, которую предполагается выполнить, и вы не сможете ничего сделать, пока задача не завершится.

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

Автор: ForceBru Размещён: 20.08.2016 11:31

0 плюса

Решение

Я изучил код, реализующий потоки. Класс Thread в cpython 3. Метод init просто присваивает некоторые переменные и не делает ничего похожего на фактическое создание нового потока. Поэтому мы можем предположить, что это должно быть безопасно использовать Threading.Thread объекта в предложенном порядке.

Автор: Riccardo Cagnasso Размещён: 23.08.2016 11:55
Вопросы из категории :
32x32