python多线程失败,一直只有一个线程的解决办法
在学python多线程的时候,照着网上的代码,一模一样的!!别人多线程,我一直单线程,很离谱。
代码如下
import threading import time def job_1(): print('This is a new threading') for i in range(10): time.sleep(0.2) print('T1 was finished') def job_2(): print('This is a new different threading') print('T2 was finished') def main(): print(threading.current_thread().getName()) new_threading_1 = threading.Thread(target=job_1()) #定义一个新线程,线程的名称,要做什么工作 new_threading_2 = threading.Thread(target=job_2()) new_threading_1.start() #添加线程,开始准备工作 new_threading_2.start() print('process was finished') if __name__=='__main__': main()
但是结果却是按顺序,按部就班的出来
在找了很多东西之后,在简书发现一篇帖子:https://www.jianshu.com/p/79372add4c45
然后,我照着改了一下,发现还真是。在设置线程的语句里,target的值不要加括号
print(threading.current_thread().getName()) # new_threading_1 = threading.Thread(target=job_1()) #定义一个新线程,线程的名称,要做什么工作 new_threading_1 = threading.Thread(target=job_1) # new_threading_2 = threading.Thread(target=job_2()) new_threading_2 = threading.Thread(target=job_2)
在做了这样的小修改后,运行程序,可以按预期的来
---------2021.3.12更新------------
BakaFT老哥回复了关于解决函数参数的问题,但是还有一个细节要注意
添加参数最好使用[]而不是(),虽然俩个方式都可以用。
import threading def scan(a,b): for i in range(10): print(i,":",a,b) t1 = threading.Thread(target=scan,args=(100,200)) #使用的括号() t2 = threading.Thread(target=scan,args=[200,300]) #使用的方括号[] t1.start() t2.start() t1.join() t2.join()
输出
但是当函数只有一个参数时,结果就不一样了
import threading def scan(a): for i in range(10): print(i,":",a) t1 = threading.Thread(target=scan,args=(100)) t2 = threading.Thread(target=scan,args=[200]) t1.start() t2.start() t1.join() t2.join()
结果:
报错了 argument after * must be an iterable, not int
因为如果使用()来传递参数,要这样子
t1 = threading.Thread(target=scan,args=(100,200,300))
如果只有一个参数,逗号也不能省略
t1 = threading.Thread(target=scan,args=(100,))
所以还是推荐使用[]