进程、进程池、队列、线程、互斥锁、ThreadLocal

------------------------------------------------------------进程----------------------------------------------------------
from multiprocessing import Process
#主程序
if name == “main”:
#启动父进程
#创建子进程
p = Process(target = 函数名, args = 子进程函数的所需参数)
#启动子进程
p.start()

但是这样执行的话整个过程是父进程启动、结束、子进程启动、结束
想要父进程启动、子进程启动、结束、父进程结束的话,需要在p.start()底下加一行代码p.join()即可。

但是如果遇到一个进程是死循环,那么就不能加join()了,就要改用为terminate()来强行停止该进程,否则没办法停止父进程。

父进程负责坐享其成就好,创建多个子进程让他们同时工作

全局变量在多个进程中不能共享,因为不同的进程堆栈不同,地址不同

每个进程都有自己的PID,因此可以使用以下代码查看PID:
import os
os.getpid()

-----------------------------------------------------进程池-------------------------------------------------------------
from multiprocessing import Pool
p = Pool(参数)填入的参数为同时进行的进程数,默认为本机的核数
放入进程池需要以下代码:
p.apply_async(函数名,args = 子进程函数的所需参数)
#调用join之前先close,调用close后就不能添加新的进程
p.close()
p.join()
子进程之间没有执行的先后顺序。

------------------------------------------------进程间的相互通讯-----------------------------------------------
既然进程之间的参数不共享,那么如何在进程之间实现通讯呢?
进程之间可以创建一个队列来实现通讯。这个队列不是堆栈,而是漏斗(先进先出),更像是中间商(没有中间商赚差价),因此,取数据的进程只需按顺序取即可,代码如下:
from multiprocessing import Queue
#q即为一个队列了
q = Queue()
将q这个队列当做参数传给需要通讯的进程即可。

------------------------------------------------------线程---------------------------------------------------------------
线程是在进程下面的基础,任何一个进程都会启动一个主线程,主线程可以启动子线程,线程之间共享全局变量,代码如下:
import threading
threading.current_thread() #用来返回当前线程的实例
#创建子线程
t = threading.Thread(target = “函数名称”,name = “子线程名称”)
t.start()
t.join()

-----------------------------------------------------互斥锁-------------------------------------------------------------
因为多个线程是共享全局变量的,因此当多个线程使用并修改同一个变量时就会产生互斥,最终产生错误的计算结果。
有了互斥锁就可以等待一个进程使用完并释放以后另一个进程再去使用这个变量,代码如下:
a = threading.Lock() #创建锁
a.acquire() #锁定
a.release() #释放锁
如果没有释放锁就会出现死锁现象,别的线程无法访问变量
如果你害怕忘记释放锁,那么请自觉使用**with lock:**自动上锁和解锁。

------------------------------------------------ThreadLocal-----------------------------------------------------------
我的理解啊,就是在创建完一个全局ThreadLocal对象以后让本来共享的局部变量变成不共享,如何使用呢,看如下代码:
num = 0
local = threading.local()
local.x = num
#将num中的数据赋值给local.x,可以把local.x看做一个新的变量,但是多线程中的local.x之间互不影响,这种方式和上锁比可以大大降低错误的概率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值