Многопоточность различных выходных данных с одинаковым кодом

#python #multithreading

Вопрос:

Исходный код был

 import time, threading

balance = 0

def change_it(n):
    global balance
    balance = balance   n
    balance = balance - n

def run_thread(n):
    for i in range(2000000):
        change_it(n)

t1 = threading.Thread(target=run_thread, args=(5,))
t2 = threading.Thread(target=run_thread, args=(8,))

t1.start()
t2.start()
t1.join()
t2.join()
print(balance)
 

Что давало случайные результаты, потому что потоки влияли друг на друга
Но когда я попытался

 t1 = threading.Thread(target=run_thread(5))
t2 = threading.Thread(target=run_thread(8))
 

каждый раз это срабатывало должным образом. Почему они разные?

Ответ №1:

Ваша вторая попытка на самом деле не выполняет никаких потоков. Вместо запуска потоков ваши команды выполняют вашу run_thread функцию на месте. Вот почему вы должны передать параметры своей потоковой функции с помощью кортежа args, чтобы она работала правильно. Если вы заявите

 target=run_thread(5)
 

цель получает возвращаемое значение выполнения run_thread(5) , которое в данном случае равно None, поскольку ваша функция ничего не возвращает, но, конечно, выполняет вычисления внутри функции, когда она выполняет ее, чтобы получить возвращаемое значение.

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

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

1. о, я понимаю. Я думал, что резьба. Поток(Цель=что-то()) также может определять поток. Спасибо, что ответили

2. Это могло бы. Вы могли бы использовать эту конструкцию, но тогда ваш something() должен возвращать вызываемую функцию. Это может быть полезно в некоторых случаях, но это не связано с вашей проблемой здесь. В вашем случае вы должны использовать структуру args для передачи параметров, если и когда они something будут выполняться в потоке.