2019.09.17学习整理
线程
线程基础
在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程,cpu真正的执行单位是线程
右键运行:
申请内存空间,先把解释器丢进去并且把代码丢进去(进程做的),运行代码(线程).
进程和线程的区别:
过程描述的区别
线程==》单指代码的执行过程
进程==》资源的申请与销毁的过程
进程内存空间彼此隔离
同一个进程下的线程共享资源.
进程和线程的创建速度
进程需要申请资源开辟空间 慢
只是告诉操作系统一个执行方案 快
线程的两种开启方式
方式一
from threading import Thread
import timedef task():print('线程 start')time.sleep(2)print('线程 end')if __name__ == '__main__':t=Thread(target=task)t.start()print('主线程')
方式二
from threading import Thread
import timeclass MyT(Thread):def run(self) :print('子线程 start')time.sleep(2)print('子线程 end')t=MyT()
t.start()
print('主线程')
线程vs进程
打印效果
rom threading import Thread
from multiprocessing import Process
import timedef task(name):print(f'{name} is running')time.sleep(2)print(f'{name} is end')if __name__ == '__main__':t = Thread(target=task,args=('子线程',))p = Process(target=task,args=('子进程',))# t.start()p.start()print('主')开启子线程的打印效果:子线程 is running
主
子线程 is end开启子进程打印效果:主
子进程 is running
子进程 is end
进程和线程的创建速度
开启子进程需要申请资源开辟空间 慢
开启子线程只是告诉操作系统一个执行方案 快
线程的join方法
方法一
from threading import Thread
import time
def task():print('子线程 start')time.sleep(2)print('子线程 end')t = Thread(target=task)
t.start()
t.join() # 等待子线程运行结束
print('主线程')
方法二单核下同一个进程的线程如何切换
from threading import Thread
import time
def task(name,n):print(f'{name} start')time.sleep(n)print(f'{name} end')t1 = Thread(target=task,args=('线程1',1))
t2 = Thread(target=task,args=('线程2',2))
t3 = Thread(target=task,args=('线程3',3))
start = time.time()
t1.start()
t2.start()
t3.start()
t1.join() # 111s
t2.join() #
t3.join()
end = time.time() # 3.0039877891540527
# 思考一下 在单核的情况下 多个线程是如何利用cpu的
print(end-start)# print('主线程')
线程的其他方法
from threading import Thread,currentThread,enumerate,activeCount
# import threading
import time
# threading.current_thread()
# threading.current_thread()def task():print('子线程 start')time.sleep(2)print('子线程 end')print(enumerate())# print(currentThread(),'子线程')
if __name__ == '__main__':t1 = Thread(target=task)t2 = Thread(target=task)t1.start()t2.start()# print(t1.is_alive()) # True# print(t1.getName()) # Thread-1# print(t2.getName()) # Thread-2# t1.setName('班长')# print(t1.getName())# print(currentThread().name)# print(enumerate()) # [<_MainThread(MainThread, started 1856)>, <Thread(Thread-1, started 6948)>, <Thread(Thread-2, started 3128)>]# print(activeCount()) # 3# print(len(enumerate())) # 3
守护线程
# 守护线程 守护的是进程的运行周期
from threading import Thread,enumerate,currentThread
import timedef task():print('守护线程开始')print(currentThread())time.sleep(20)# print('守护线程结束')def task2():print('子线程 start')time.sleep(5)print(enumerate())print('子线程 end')if __name__ == '__main__':t1 = Thread(target=task)t2 = Thread(target=task2)t1.daemon = Truet2.start()t1.start()print('主')