Python中run()与start()的区别及常用文件操作指南
本文详细解析Python中Thread类的run()与start()方法差异,通过代码示例说明run仅调用普通函数而start真正启动子线程,并对比线程名与ID表现。同时补充os.path模块常用功能,涵盖文件名获取、路径分割、文件遍历及大小计算等实用操作。
Python中run()与start()的区别
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文件操作常用工具
补充知识: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)
分割文件扩展名
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')
或者
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() 函数的比较与差别介绍,以及文件操作常用技巧,就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













