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 import Process,Pool
import time,os

def foo(i):
    time.sleep(1)
    print(i)
    print("son",os.getpid())
    return i+100


def bar(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 import Process,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 import Manager


def f(d,l,n):
    d[n]=1
    d["xzxx"]=900
    l.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 in p_list:
            res.join()


        print(d)
        print(l)

 

总结:进程理解:由于线程的多线程并不是正真意义上的多线程(因为GIL全局锁的原因),但是python可以实现多进程的并行,同时调用多个核心数,进程之间的内存是互相隔离的,但是他们的一些资源确实共享的,如打印服务等。。进程比较消耗系统资源,但是可以使用多进程+多协程的方式进行任务处理

posted @ 2019-10-29 13:58  coldplaycode  阅读(194)  评论(0编辑  收藏  举报

coldplaycode