进程理解:由于线程的多线程并不是正真意义上的多线程(因为GIL全局锁的原因),
但是python可以实现多进程的并行,同时调用多个核心数,进程之间的内存是互相隔离的,
但是他们的一些资源确实共享的,如打印服务等。。进程比较消耗系统资源,
但是可以使用多进程+多协程的方式进行任务处理
#开进程的方法一:
# import time
# import random
# from multiprocessing import Process
# def piao(name):
# print('%s piaoing' %name)
# time.sleep(random.randrange(1,5))
# print('%s piao end' %name)
#
#
# if __name__=="__main__":
# p1=Process(target=piao,args=('egon',)) #必须加,号
# p2=Process(target=piao,args=('alex',))
# p3=Process(target=piao,args=('wupeqi',))
# p4=Process(target=piao,args=('yuanhao',))
#
# p1.start()
# p2.start()
# p3.start()
# p4.start()
# print('主线程')
#开进程的方法二:
import time
import random
from multiprocessing import Process
class Piao(Process):
def __init__(self,name):
super().__init__()
self.name=name
def run(self):
print('%s piaoing' %self.name)
time.sleep(random.randrange(1,5))
print('%s piao end' %self.name)
if __name__=='__main__':
p1=Piao('egon')
p2=Piao('alex')
p3=Piao('wupeiqi')
p4=Piao('yuanhao')
p1.start() #start会自动调用run
p2.start()
p3.start()
p4.start()
print('主线程')
进程的join方法
# import time
# from multiprocessing import Process
#
#
# def f(name):
# time.sleep(1)
# print("hello",name,time.ctime())
#
#
#
# if __name__=="__main__":
# p_list=[]
# for i in range(3):
# p=Process(target=f,args=("alex",))
# p_list.append(p)
# p.start()
#
# for l in p_list:
# l.join()
#
# print("end")
# from multiprocessing import Process
# import time
#
# class MyProcess(Process):
# def __init__(self):
# super().__init__()
#
#
# 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.daemon=True#daemon守护进程 跟join效果相反
# p.start()
# p_list.append(p)
#
# # for l in p_list:
# # l.join()
#
# print("end")
# import time,os
# from multiprocessing import Process
#
# def info(title):
# print("title: ",title)
# print("parent process: ",os.getppid())# 父进程pid
# print("process id ",os.getpid())#pid 进程号
#
# def f(name):
# info("function f")
# print("hello",name)
#
#
# if __name__=="__main__":
#
# info("main process line")
# time.sleep(1)
# print("-----------------------------")
# p=Process(target=info,args=("yuan",))
# p.start()
# p.join()
#进程池
from multiprocessing importProcess,Poolimporttime,osdeffoo(i):
time.sleep(1)print(i)print("son",os.getpid())return i+100
defbar(arg):print(os.getpid())#print(os.getppid())
print('logger',arg)if __name__=="__main__":
pool=Pool(5)#进程池对象 如果不设置进程池的个数,默认以cpu核心数来运行
print("main",os.getpid())#bar(1)
#print("---------------")
for i in range(10):
pool.apply(func=foo,args=(i,))#同步接口
#回调函数: 某个函数执行成功之后在去执行的函数
#func=foo,args=(i,)------>返回值作为 callback 回调函数的参数
#pool.apply_async(func=foo,args=(i,),callback=bar)#callback=bar回调函数 异步接口
#此处的回调函数是在主进程里面执行的
pool.close()
pool.join()#join与close调用顺序是固定的
print("ending")
#进程队列#队列:线程同步安全使用#import multiprocessing#import queue,time#
#def foo(q):#print("son process",id(q))#time.sleep(1)#q.put(123)#q.put("alex")#
#
##进程之间的数据是独立的,独占一块内存,通信是数据之间的拷贝比较麻烦#
#if __name__=="__main__":#
##q = queue.Queue()线程队列#
#
#q=multiprocessing.Queue()#进程队列#p=multiprocessing.Process(target=foo,args=(q,))#
#p.start()#print("main process ",id(q))#p.join()#print(q.get())#print(q.get())
#进程之间管道通信
from multiprocessing importProcess,Pipe#def f(conn):#conn.send([12,{"name":"yuan"},"hello"])#response=conn.recv()#print("response",response)#conn.close()#print("q_ID2",id(conn))#
#
#if __name__=='__main__':#
#parent_conn,child_conn=Pipe()#双向管道#print("q_ID1:",id(child_conn))#p=Process(target=f,args=(child_conn,))#p.start()#print(parent_conn.recv())#parent_conn.send("儿子你好")#p.join()
#Queue和Pipe只是实现了数据交互,并没有实现数据共享,即一个进程去更改另一个进程的数据
#进程共享数据
from multiprocessing importManagerdeff(d,l,n):
d[n]=1d["xzxx"]=900l.append(n)if __name__=="__main__":
with Manager() as manager:#Manager进程共享对象
d=manager.dict()
l=manager.list(range(5))
p_list=[]for i in range(10):
p=Process(target=f,args=(d,l,i))
p.start()
p_list.append(p)for res inp_list:
res.join()print(d)print(l)