Почему current_thread () всегда возвращает MainThread?

Я начал изучать темы в Python.
Я видел этот код, который говорит, что если я хочу запустить 2 потока одновременно, я учусь на бесплатном курсе удэми, и именно так он печатает имя потока.
Только он получает "нить-1", "нить-2". Я должен сделать это так:

if __name__ == '__main__':
Thread(target = displayNums()).start()
Thread(target = stam()).start()

Увидел это здесь: заставить 2 функции работать одновременно

Теперь я пытаюсь запустить 2 или 3 потока одновременно и получить их имя. Но я всегда получаю MainThread мой код:

from threading import *

def displayNums():
    i = 0
    print(current_thread().getName() , "suo")
    while i <= 10:
        print(i)
        i+=1
print(current_thread().getName())
t = Thread(target=displayNums())


def stam():
    k = 0
    print(current_thread().getName(), "sss")
    while k <= 50:
        print(k,"k")
        k+=1



if __name__ == '__main__':
    Thread(target = displayNums()).start()
    Thread(target = stam()).start()

Я не получаю ошибок, но я получаю этот вывод:

    MainThread
MainThread suo
0
1
2
3
4
5
6
7
8
9
10
MainThread suo
0
1
2
3
4
5
6
7
8
9
10
MainThread sss
0 k
1 k
2 k
3 k
4 k
5 k
6 k
7 k
8 k
9 k
10 k
11 k
12 k
13 k
14 k
15 k
16 k
17 k
18 k
19 k
20 k
21 k
22 k
23 k
and so on...

Всего 2 ответа


Изменить это:

if __name__ == '__main__':
    Thread(target = displayNums()).start()
    Thread(target = stam()).start()

к этому:

if __name__ == '__main__':
    Thread(target = displayNums).start()
    Thread(target = stam).start()

Целью потока является сама функция, а не возвращаемое значение из функции. stam() вызывает функцию и возвращает ее значение, но stam - это сам объект функции. Когда вы создаете поток, вам нужна сама функция, а не ее возвращаемое значение.

РЕДАКТИРОВАТЬ: Вы вызываете функцию, когда вы хотите запустить ее прямо сейчас. Вы можете получить доступ к его возвращенному значению, например, x = f() присвоит возвращаемое значение f x. Существуют другие ситуации, когда вы не хотите запускать функцию прямо сейчас, но вы хотите отслеживать ее, чтобы вы могли вызвать ее позже. Это в случае с потоками. Вы не хотите запускать функцию, вы хотите сообщить конструктору потока, какую функцию запустить во втором потоке. Таким образом, в этом случае вы передаете саму функцию в качестве аргумента. Обычно это означает, что имя функции без скобок.

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

Попробуй это:

# print is a function (built-in), and I can assign it to a variable
a = print
# Nothing gets printed yet
# the variable 'a' is now the same thing as the print function
a("Hello world")

Это глупый пример, но есть много реальных ситуаций, где это очень полезно.


Ваш код фактически вызывает целевые потоки вне потоков. Измените свой код на:

if __name__ == '__main__':
    Thread(target = displayNums).start()
    Thread(target = stam).start()

Есть идеи?

10000