进程笔记

创建进程

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()

你可能感兴趣的:(进程笔记)