Почему current_thread () всегда возвращает MainThread? - PullRequest
0 голосов
/ 13 февраля 2020

Я начал изучать потоки в python.
Я увидел здесь код, который говорит, что если я хочу запустить 2 потока одновременно, я учусь на бесплатном курсе удэми, и именно так он печатает потоки. name.
Только он получает "thread-1", "thread-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 ]

0 голосов
/ 13 февраля 2020

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

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

на это:

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

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

EDIT: Вы вызываете функцию, когда хотите запустить ее прямо сейчас. Вы можете получить доступ к его возвращенному значению, например, 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")

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

0 голосов
/ 13 февраля 2020

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

if __name__ == '__main__':
    Thread(target = displayNums).start()
    Thread(target = stam).start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...