在學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,))
所以還是推薦使用[]