(一)进程间的通信
1、进程间的内存资源是隔离的互不干扰的。(进程之间是相互独立的)
2、进程之间通信的解决方案
import multiprocessing
a=1
def func():
global a
a=2
if __name__=='__main__':
p=multiprocessing.Process(target=func)
p.start()
p.join()
print(a)
3、Manager的基本使用(Manager相当于父进程在程序运行的时候会自动生成一个服务子进程,其作用相当于服务子进程中的保存公共数据的区域)
from multiprocessing import Process,Manager
def func(tu1):
print('我是子进程,我现在要修改m_liast')
tu1.append('a')
if __name__=='__main__':
m_list=Manager().list()
print('我是主进程中的m_list,我现在的值是%s'%m_plist)
p=Process(target=func,args=(m_list,))
p.start()
p.join()#会造成阻塞
print("我是父进程中的m_list,我现在的值是%s"%m_list)
(二)线程间的通信
1、线程和线程之间的内存区域是可以共享的,全局变量是公用的。
2、线程之间会争夺资源。
代码:a、线程间全局变量的共享
from threading import Thread
a=1
def fun():
print('我是子线程,我要修改全局变量a的值')
global a
a=2
if __name__=='__main__':
print('我是主线程,a现在的值是%s'%a)
p=Thread(target=func)
p.start()
p.join()#会造成阻塞
print('我是主线程,变量a现在的值是%s'%a)
b、线程间的资源争夺
import threding
data=0
def add_1():
global data
for i in range(1000):
data+=1
def add_2():
global data
for i in range(1000):
data-=1
if __name__='__main__':
p=Thread(target=func_1)
p1=Thread(target=func_1)
p.start()
p.join()
p1.satrt()
p1.join()
print(data)
3、互斥锁:控制资源访问
from threding import Thread,Lock
import time
data=0
def add_1(lock):
global data
lock.acquire()
for i in range(1000):
data+=1
lock.release()
def add_2(lock):
global data
lock.acquire()
for i in range(1000):
data-=1
lock.release()
if __name__='__main__':
lock=Lock()
p=Thread(target=func_1,args=(lock,))
p1=Thread(target=func_1,args=(lock,))
p.start()
p.join()
p1.satrt()
p1.join()
time.sleep()
print(data)
(三)进程和线程的安全队列
1、队列的基本概念:一个入口,一个出口,数据具有先进先出特点的数据结构。
2、队列的常用方法
3、python的queue模块提供了同步的,线程安全的队列类。
(四)生产者和消费者模型(通过队列实现)
代码如下:
网友评论