今天同事问了一个Python的Thread使用问题,他的程序起了一个多线程,确一直没能进到主进程,
我看了一眼代码发现问题了
下面看下他的原代码:当然是为了方便表述问题已经简化了业务逻辑
具体有问题的代码
from threading import Thread
import time
def fff(a):
#业务逻辑这里是消费一个kafka,正常不会结束,相当于一直卡在sleep这里,到不了print('after',5,a)
print(a)
time.sleep(5)
print('after',5,a)
a='aaaa'
t1 = Thread(target=fff(a))
t1.start()
print('after')
>>>
aaaa
after 5 aaaa
after
正确代码
看到这里,就知道是Python多线程用发不对,正确用法如下:
from threading import Thread
import time
def fff(a):
print(a)
time.sleep(5)
print('after',5,a)
a='aaaa'
t1 = Thread(target=fff,args=(a,))
t1.start()
print('after')
>>>
aaaaafter
after 5 aaaa
总结:
Python的多线程Thread相关类初始化的输入的参数target=后是具体的方法名,而不是方法的返回结果
如果需要参数通过args=来传递
kv类型的参数通过kwargs=的字典类型传入