python run()函数和start()函数的比较和差别介绍-kb88凯时官网登录

时间:2020-05-04
阅读:
免费资源网,https://freexyz.cn/

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'
免费资源网,https://freexyz.cn/
返回顶部
顶部
网站地图