创建进程
from multiprocessing import Process
def run1():
for i in range(5):
print('run1-{i}')
time.sleep(1)
def run2():
for i in range(5):
print('run2-{i}')
time.sleep(1)
if __name__=="__main__"
p1=process(target=run1)
p2=process(target=run2)
p1.start()
p2.start()
创建多个函数
一创建进程
'''
python
Process 函数必须包含一个target 参数,指定创建进程的函数名称
p1= process(target=run1)
"'
执行进程
'''
python
p1.start()
"'
进程对象join 方法的意思:阻塞进程
'''
python
p1.join()
"'
获取进程编号
子进程的编号:os.getpid()
主进程的编号:os.getppid()
带有参数的进程
传递非关键字参数
传递关键字参数
def run1(name,age=0):
print('run1',name,age)
# 给进程传递非关键字参数,需要定义args 参数,类型是 远足或者列表
#给进程传递关键字参数,需要定义kwargs 参数,类型是字典
p1=Process(target=run1,args=('a',),kwargs={'age':10})
守护进程
作用:当主进程结束之后,不管子进程有没有结束,当前所有进程全部结束
方法:子进程对象.daemon=Ture
可变对象:可以对数据内部进行增删改操作
列表,字典,集合
不可变对象: 字符串,元祖,整型
#先拷贝:把对象的一堆数据拷贝一份,放入到新的内存中
变量.copy()
a=[1,2,[3,4]]
b=a.copy()
输出:[1, 2, [3, 4]]
#深拷贝:把对象的所有数据全部拷贝一份,放入到新的内存中
copy.deepcopy()
import copy
a=[1,2,[3,4]]
b=copy.deepcopy(a)
能够使用with 语法,必须在类中定义两个方法
__enter__
__exit__
class A:
def__enter__(self):
#实例化
def__exit__(self):
#关闭
##多进程之间数据不共享,如果需要多进程之间数据共享,最常用的三种方式
管理器 manager
队列 queue
管道 pipe
套接字 sock(不常用)
##进程池
为什么要使用进程池:因为不会频繁的创建和销毁进行,所以节省资源
进程池中一般创建多少个进程,效率最高:电脑中 CPU核数 的两位
创建进程的步骤
1.导包
from multiprocessing import Pool
if __name__='__main__':
2.创建进程池
Pool 方法中的参数就是 初始化创建 进程的数量
pool = Pool(3)
# 3.用进程池执行进程
apply_async 中第一个参数就是 函数的名称
pool.apply_async(函数名称)
# 4.先关闭进程池
pool.close()
#5.等待所有的请求处理完成之后,再去销毁进程池的资源
pool.join()
闭包一定要满足3个条件
1.外层函数一定要包含一个内层函数
2.外层函数一定返回内层函数的函数名称
3.内层函数一定是使用外层函数的变量
##python 中的多线程是伪线层,因为GIL(全局解释性锁)的存在,所以多线程中CPU的执行时并发的
##GIL: 全局解释性锁
# 多线程的创建方式
导包: from threading import Thread
创建多个线程:
t1= Thread(target=run1)
执行
t1.start()
#等待子进程执行结束之后,再执行主线程
t1.join()
##守护线程
作用:主线程结束之后,不管子进程有没有结束,整个程序就结束
使用方式:子进程对象.setDaemon(True)
# 多线程之间数据是共享的,但是共享会数据错乱,所以必须加锁
加锁方法: lock.acquire()
释放锁: lock.release()