歡迎您光臨本站 註冊首頁

Python run()函數和start()函數的比較和差別介紹

←手機掃碼閱讀     火星人 @ 2020-05-04 , reply:0

run() 方法並不啟動一個新線程,就是在主線程中調用了一個普通函數而已。
start() 方法是啟動一個子線程,線程名就是自己定義的name。
因此,如果你想啟動多線程,就必須使用start()方法。
請看實例:(源代碼)
1 使用run()方法啟動線程,它打印的線程名是MainThread,也就是主線程。
import threading,time def worker(): count = 1 while True: if count >= 4: break time.sleep(1) count += 1 print(“thread name = {}”.format(threading.current_thread().name)) print(“Start Test run()”) t1 = threading.Thread(target=worker, name=“MyTryThread”) t1.run() print(“run() test end”)
運行結果:
Start Test run() thread name = MainThread thread name = MainThread thread name = MainThread run() test end
2 使用start()方法啟動的線程名是我們定義線程對象時設置的name="MyThread"的值,如果沒有設置name參數值,則會打印系統分配的Thread-1,Thread-2…這樣的名稱。
import threading,time def worker(): count = 1 while True: if count >= 4: break time.sleep(2) count += 1 print(“thread name = {}”.format(threading.current_thread().name)) # 當前線程名 print(“Start Test start()”) t = threading.Thread(target=worker, name=“MyTryThread”) t.start() t.join() print(“start() test end”)
運行結果:
Start Test start() thread name = MyTryThread thread name = MyTryThread thread name = MyTryThread start() test end
3 兩個子線程都用run()方法啟動,但卻是先運行t1.run(),運行完之後才按順序運行t2.run(),兩個線程都工作在主線程,沒有啟動新線程,thread ID都是一樣的,因此,run()方法僅僅是普通函數調用。
import threading,time def worker(): count = 1 while True: if count >= 4: break time.sleep(2) count += 1 print(“thread name = {}, thread id = {}”.format(threading.current_thread().name, threading.current_thread().ident)) print(“Start Test run()”) t1 = threading.Thread(target=worker, name=“t1”) t2 = threading.Thread(target=worker, name=‘t2') t1.run() t2.run() print(“run() test end”)
運行結果:
Start Test run() thread name = MainThread, thread id = 3920 thread name = MainThread, thread id = 3920 thread name = MainThread, thread id = 3920 thread name = MainThread, thread id = 3920 thread name = MainThread, thread id = 3920 thread name = MainThread, thread id = 3920 run() test end
4 使用start()方法啟動了兩個新的子線程並交替運行,每個子進程ID也不同。
import threading,time def worker(): count = 1 while True: if count >= 4: break time.sleep(2) count += 1 print(“thread name = {}, thread id = {}”.format(threading.current_thread().name, threading.current_thread().ident)) print(“Start Test start()”) t1 = threading.Thread(target=worker, name=“MyTryThread1”) t2 = threading.Thread(target=worker, name=“MyTryThread2”) t1.start() t2.start() t1.join() t2.join() print(“start() test end”)
運行結果:
Start Test start() thread name = MyTryThread1, thread id = 4628 thread name = MyTryThread2, thread id = 872 thread name = MyTryThread1, thread id = 4628 thread name = MyTryThread2, thread id = 872 thread name = MyTryThread1, thread id = 4628 thread name = MyTryThread2, thread id = 872 start() test end
補充知識:python 文件操作常用輪子
path
注意: 對於任何需要處理文件名的問題,都應該使用os.path模塊而不是字符串操作。兩個原因,os.path能夠處理移植性問題,如windows,linux。 另一個原因,不要重複造輪子
獲取文件名
import os filename = os.path.basename(filepath) print(filename)
獲取文件當前文件夾目錄
filename = os.path.dirname(filepath)
同時獲取文件夾和文件名
dirname, filename = os.path.split(filepath)
split 文件擴展名
path_without_ext, ext = os.path.splitext(filepath) # e.g 'hello/world/read.txt' then # path_without_ext = hello/world/read, ext = .txt
遍歷文件夾下所有文件方法
import glob pyfiles = glob.glob('*.py')
or
def getAllFiles(filePath, filelist=[]): for root, dirs, files in os.walk(filePath): for f in files: filelist.append(os.path.join(root, f)) print(f) return filelist
判斷是否為文件 file
os.path.isfile('/etc/passwd')
判斷是否為文件夾 folder
os.path.isdir('/etc/passwd')
是否是軟鏈接
os.path.islink('/usr/local/bin/python3')
軟鏈接真正指向的是
os.path.realpath('/usr/local/bin/python3')
size
獲取文件大小
import os size = os.path.getsize(filepath) print(size)
獲取文件夾大小
import os def getFileSize(filePath, size=0): for root, dirs, files in os.walk(filePath): for f in files: size += os.path.getsize(os.path.join(root, f)) print(f) return size print(getFileSize("."))
time
import time t1 = os.path.gettime('/etc/passwd') # t1 1272478234.0 t2 = time.ctime(t1) # t2 'Wed Apr 28 12:10:05 2010'


[火星人 ] Python run()函數和start()函數的比較和差別介紹已經有392次圍觀

http://coctec.com/docs/python/shhow-post-232849.html