zoukankan      html  css  js  c++  java
  • 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可以实现多进程的并行,同时调用多个核心数,进程之间的内存是互相隔离的,但是他们的一些资源确实共享的,如打印服务等。。进程比较消耗系统资源,但是可以使用多进程+多协程的方式进行任务处理

    如果我失败了,至少我尝试过,不会因为痛失机会而后悔
  • 相关阅读:
    JS 面向对象
    inline-block元素间隙处理
    MUI
    MUI
    chrome://inspect调试html页面空白,DOM无法加载的解决方案
    MUI
    MUI
    MUI
    MUI
    MUI
  • 原文地址:https://www.cnblogs.com/tangcode/p/11758340.html
Copyright © 2011-2022 走看看