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,))

 所以還是推薦使用[]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM