线程
线程杂谈
#线程:CPU最小的执行单位。
#进程:资源集合/资源单位
#线程运行:运行代码
#进程运行:各种资源 +线程
"""
右键运行:
申请内存空间,先把解释器(解释器代码)丢进去并且把写的代码丢进去(进程做的),运行代码(线程)(解释器开启进程先解释我写的代码)。
进程和线程的区别:
线程 ==> 单指代码的执行过程
进程 ==> 资源的申请与销毁的过程
进程内存空间彼此隔离
同一个进程下的线程共享资源。
进程和线程的创建速度:
进程需要申请资源开辟空间 慢
只是告诉操作系统一个执行方案 快
"""
线程用法
#线程开启的方式一:
from threading import Thread
import time
# 进程等待所有线程结束才会结束
def task():
print('子线程 开启')
time.sleep(2)
print('子线程 结束')
# if __name__ == '__main__':
'''
这句可以不需要加,因为线程执行不需要重新开启内存空间,
直接是让操作系统开线程,也不会出现开启子进程那种类似递归的
问题
'''
t = Thread(target=task)
t.start()
print('主线程')
#线程开启的方式二(继承Thread类):
from threading import Thread
import time
class task(Thread):
def run(self):
print('子进程 开始')
time.sleep(3)
print('子进程 结束')
t = task()
t.start()
print('主线程')
#子进程和子线程的开启速度
from multiprocessing import Process
from threading import Thread
import time
def task(name):
print(f'{name} start')
time.sleep(2)
print(f'{name} end')
if __name__ == '__main__':
p = Process(target=task, args=('子进程', ))
t = Thread(target=task, args=('子线程', ))
t.start() #先打印子进程 start ,然后是 主, 最后是子进程 end
# p.start()#先打印主,然后是子进程 start 最后是子进程 end
print('主')
'''
进程和线程的创建速度
开启子进程需要申请资源开辟空间 慢
开启子线程只是告诉操作系统一个执行方案 快
'''
#子线程共享资源
from threading import Thread
import os
x = 100
def task():
global x
x = 50
print(os.getpid()) #打印的是子线程的pid号
if __name__ == '__main__':
t = Thread(target=task)
t.start()
print(x)
print(os.getpid()) #打印的是主线程的pid号
'''
主线程和子线程共用一块内存空间,因为pid号相同,且x修改成功
'''
#线程的join方法
from threading import Thread
import time
def task(name, n):
print(f'{name}{n} start')
time.sleep(2)
print(f'{name}{n} end')
if __name__ == '__main__':
start = time.time()
t1 = Thread(target=task, args=('子线程', 1))
t2 = Thread(target=task, args=('子线程', 2))
t3 = Thread(target=task, args=('子线程', 3))
t1.start()
t2.start()
t3.start()
t1.join() # 等待子线程运行结束
t2.join() # 等待子线程运行结束
t3.join() # 等待子线程运行结束
end = time.time()
print('主') #最后才运行 主
print(end - start) #2.001624822616577
# 主进程和子线程的结束时间
from multiprocessing import Process
from threading import Thread
import time
def task():
print('进程 开启')
time.sleep(5)
print('进程 结束')
def task2():
print('子线程 开启')
time.sleep(2)
print('子线程 结束')
if __name__ == '__main__':
p = Process(target=task)
t = Thread(target=task2)
t.start()
p.start()
print('子进程未开始')
p.join() #主进程的主线程等待子进程运行结束
print('主')