今天是2019.08.21.学习python的第六天,虽然不是太爱学,但是一直还在坚持,能学点是点吧。
进程之间的通信
import multiprocessing
def A(conn):#conn表示管道类型
conn.send([‘a’,‘b’,‘c’,‘d’,‘e’])#要发送的数据
print(‘A’,conn.recv()) #收到的数据
conn.close() #关闭
if name==“main”:
conn_a,conn_b=multiprocessing.Pipe()#创建一个管道,有两个口
p=multiprocessing.Process(target=A,args=(conn_a,))
p.start()
conn_b.send([1,2,3,4,5,6,7])#发送数据给conn_a
print(‘mian’,conn_b.recv())
结果A [1, 2, 3, 4, 5, 6, 7]
mian [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
类似于聊天机器人的一个对话
import os
import multiprocessing
def M(conn):
while 1:
recv_=conn.recv()
print(‘机器人收到:%s’%recv_)
if recv_“你好”:
conn.send(‘我很好,谢谢’)
elif recv_“今天天气怎么样”:
conn.send(‘不知道,自己去看天气预报’)
else:
conn.send(‘你是傻逼吧,什么都不知道’)
def p(conn):
y=‘y’
while y !=‘n’:
input_=input(‘人说’)
conn.send(input_)
os.system(‘say %s’%conn.recv())
if name==“main”:
conn_M,conn_p=multiprocessing.Pipe()
p_M=multiprocessing.Process(target=M,args=(conn_M,))
p_M.start()
p(conn_p)
全局变量不可进程共享
import multiprocessing
import os
data =[]
def List():
global data
data.append(1)
data.append(2)
data.append(3)
print(‘p’,os.getpid(),data)
if name==“main”:
p=multiprocessing.Process(target=List,args=())#子进程
p.start()
data.append(‘a’)脚本主进程
data.append(‘b’)
data.append(‘c’)
print(‘main’,os.getpid(),data)
结果main 2220 ['a', 'b', 'c']
p 11268 [1, 2, 3]
队列可以进程共享
import multiprocessing
import os
queue=multiprocessing.Queue()
def A(q):
print(os.getpid())
q.put([1,2,3,4])#子进程的插入
if name==“main”:
print(os.getpid())
queue.put([‘a’,‘b’])#这里脚本父进程先插入了,子进程就没法再插入了
p=multiprocessing.Process(target=A,args=(queue,))
p.start()
print(queue.get())#脚本父进程取出
结果[‘a’, ‘b’]
注意队列只能单向,要么是父进程插入子进程取出,要么是子进程插入父进程取出
import multiprocessing
import time
def PUT(q):
for i in range(10):
time.sleep(1)
q.put(100)
def GET(q):
while 1:
try:
print(‘GET’,q.get(timeout=5))
except:
print(‘队列中已经无法获取元素在五秒之内’)
break
if name==“main”:
q=multiprocessing.Queue()
p1=multiprocessing.Process(target=PUT,args=(q,))
p2=multiprocessing.Process(target=GET,args=(q,))
p1.start()
p2.start()
结果
GET 100
GET 100
GET 100
GET 100
GET 100
GET 100
GET 100
GET 100
GET 100
GET 100
队列中已经无法获取元素在五秒之内
进程数据共享
import multiprocessing
def func(num):
num.value=10
if name==“main”:
multiprocessing.Value可以在不同进程之间共享数据
num=multiprocessing.Value('d',1)#double float
print(num.value)#单单num返回的结果Synchronized wrapper for c_double(1.0)
p=multiprocessing.Process(target=func,args=(num,))
p.start()
p.join()
print(num.value)
进程列表数组共享
import multiprocessing
def func(num):
num[2]=9999
if name==“main”:
#不同进程之间实习数组共享
num=multiprocessing.Array(‘i’,[1,2,3,4,5,6]) #i代表int类型
print(num[:])
p=multiprocessing.Process(target=func,args=(num,))
p.start()
p.join()
print(num[:])
进程字典列表共享
import multiprocessing
def func(mydict,mylist):
mydict[“张包子”]=“牛皮”
mydict[“张大炮”]=“大美女”
mylist.append(11)
mylist.append(22)
mylist.append(33)
if name==“main”:
with multiprocessing.Manager() as MG:
mydict=MG.dict()
mylist=MG.list(range(5))
mydict=multiprocessing.Manager().dict()
mylist=multiprocessing.Manager().list(range(5))
p=multiprocessing.Process(target=func,args=(mydict,mylist))
p.start()
p.join()
print(mylist)
print(mydict)