转自:https://www.cnblogs.com/tsgxj/p/9251710.html
1.进程的创建
from multiprocessing import Process
import time,os
def Hi(name):
time.sleep(3)
print("Hello %s" % name,time.ctime())
print("进程号是 ",os.getpid())
if __name__=="__main__":
for i in range(3):
t = Process(target=Hi,args=("萌萌",))
t.start()
print("主进程号:",os.getpid())
print("end all")
2.进程的阻碍
from multiprocessing import Process
import time,os
def hello(name):
time.sleep(2)
print("Hello %s" % name,time.ctime())
print("进程号是 ",os.getpid())
if __name__=="__main__":
L=[]
for i in range(3):
t= Process(target=hello,args=("梦梦",))
t.start()
L.append(t)
# t.join()
# t.join() # 阻碍主进程
for t in L:
t.join()
print("主进程号:",os.getpid())
print("end all")
2.2.进程的继承调用
from multiprocessing import Process
import time,os
class MyProcess(Process):
# def __init__(self,name):
# super(MyProcess,self).__init__()
# self.name =name
def run(self):
time.sleep(1)
print("hello",self.name,time.ctime())
if __name__ == '__main__':
p_list=[]
for i in range(3):
# p =MyProcess("张三")
p = MyProcess()
p.start()
p_list.append(p)
# p.join()
for p in p_list:
p.join()
print("end")
3.进程的守护
# ___''Daemon:进程守护、子进程跟随主进程一起退'''
class myprocess:
def music1(self):
print("begin to listen %s" %time.ctime())
time.sleep(2)
print("stop to listen %s" % time.ctime())
def game1(self):
print("begin to game %s" % time.ctime())
time.sleep(3)
print("stop to game %s" % time.ctime())
if __name__ == "__main__":
duixiang=myprocess()
p1 = Process(target=duixiang.music1)
p2 = Process(target=duixiang.game1)
p2.daemon=True
L=[]
L.append(p1)
L.append(p2)
for i in L:
i.start()
# i.join()
print("all over end.......")
4.进程通信队列-Queue
from multiprocessing import Process,Queue
import time
def foo(q):
time.sleep(1)
q.put(6776)
q.put({"name":"张三"})
if __name__ == '__main__':
q = Queue()
#q=multiprocessing.Queue()
#创建一个进程队列
p=Process(target=foo,args=(q,))
p.start()
print(q.get())
print(q.get_nowait())
print(q.get(block=False))
5.进程通信-管道Pipe
from multiprocessing import Process, Pipe
import time
import os
def f(conn):
conn.send([12,{"name":"子豪"},"hello"])
date=conn.recv()
print("父亲发的消息是",date,time.ctime())
conn.close()
print("子进程进程号%s,子进程拿到的数据ID %s:"%(os.getpid(),id(conn)))
if __name__ == '__main__':
parent_conn,child_conn=Pipe()
p =Process(target=f,args=(child_conn,))
p.start()
sunsend=parent_conn.recv()
print("儿子发消息是:",sunsend,time.ctime())
parent_conn.send("儿子,你好")
parent_conn.close()
print("父进程进程号%s,父进程拿到的数据ID %s:" %(os.getpid(),id(parent_conn)))
p.join()
6.进程同步
'''加锁的部分完全是串行的'''
from multiprocessing import Process,Lock
import time
def f(l,i):
l.acquire()
time.sleep(1)
print("hello " ,i)
l.release()
if __name__ == '__main__':
lock =Lock()
for num in range(10):
Process(target=f,args=(lock,num)).start()
7.进程间的数据共享 Managers
# ------------------Managers 进程间数据共享-----------------
# # Queue、Pipe 只实现了数据的互交并没有实现数据的共享
from multiprocessing import Manager,Process
import os
def fun(d,L,n):
d[n]="1" # {"0": "1"}
d["2"]="2" # {"0": "1","2":"2"}
L.append(n)
print('子进程进程号:%s, 字典id %s,列表id %s'%(os.getpid(),id(d),id(L)))
if __name__ == '__main__':
with Manager() as manager:
d = manager.dict()
L = manager.list(range(9))
for i in range(10):
p = Process(target=fun,args=(d,L,i))
p.start()
p.join()
print(d)
print(L)
print("所有任务都已经结束")
# print(d)
# print(L)
8.进程池
def f(i):
time.sleep(1)
print(i)
if __name__ == '__main__':
pool=Pool(5) # 不填参数默认以CPU数量运行
for i in range(100):
# pool.apply(func=f,args=(i,)) # 同步接口
pool.apply_async(func=f,args=(i,))
pool.close()
pool.join()
# 进程池的格式先close后join、调用顺序是固定的
print("over all")