Python的多线程
1、多任务的概念
1.1 单任务
一个一个完成任务
1.2 多任务
同一时间内执行多个任务
1.3 并发和并行
1.3.1 并行
一起执行
1.3.2 并发
任务的交替进行
2、进程、线程与协程
2.1 进程
进程:是系统进行资源分配的基本单位。
进程:动态的概念,运行起来的程序,包括程序,以及运行程序所需要的计算机资源等。
程序:静态的概念,我们写的.py或.go等,都是程序。
2.1.1 进程状态
2.1.2 多进程的概念
import multiprocessing
import time
import os
def read1(*args, **kwargs):
print(*args)
for i in range(1000):
print("子进程在打印信息,姓名",args[0],"age",args[1])
print(kwargs)
print(os.getpid())
print(os.getppid())
if __name__ == "__main__":
print("主进程",os.getpid())
p = multiprocessing.Process(target=read1, name= "son", args= ("laowang", 18),kwargs= {"gender":"girl"})
p.start()
time.sleep(1)
p.join()
print("主进程结束啦")
exit()
注意点:
1、os.getpid获取执行当前任务的进程编号
2、os.getppid获取的是当前进程的父进程编号
3、多进程之间不共享全局变量,多个进程之间是独立的
2.1.3 传参
def read1(*args, **kwargs):
print(*args)
for i in range(1000):
print("子进程在打印信息,姓名",args[0],"age",args[1])
print(kwargs)
print(os.getpid())
print(os.getppid())
if __name__ == "__main__":
print("主进程",os.getpid())
p = multiprocessing.Process(target=read1, name= "son", args= ("laowang", 18),kwargs= {"gender":"girl"})
p.start()
2.1.4 队列
try:
for i in range(3):
que.put("123",True,1)
except Exception as e:
print("消息队列已经满了","当前数据有%s个"%que.qsize())
注意点:
1、put在默认的情况下,如果队列已经满了,一直阻塞,等待队列出现空余位置
2、如果设置了timeot,那么等待过后,就会报错
3、block设置为false,不等待直接报错
if not que.full():
for i in range(que.qsize()):
que.put_nowait("123")
2.1.5 进程池
po = multiprocessing.Pool()
print(type(po))
# pid = os.fork()
# for i in range(0, 10):
po.apply(work)
po.apply(work2)
po.apply(func=read1, args= ("laowang",),kwds= {"gender":"girl"})
print('-------------kaishi---------------------')
po.close()
po.join()
2.2 线程
2.2.1 定义
默认情况下,程序启动只有一个线程,这个线程就是主线程,线程是CPU调度的基本单位
线程之间共享全局变量