• 多进程学习笔记


    #coding=utf-8
    '''线程与进程的区别
    线程同时修改一份数据时必须加锁,mutex互斥锁
    什么时候使用多线程?
    io操作不占用CPU
    计算占用CPU,
    pyhton多线程不适合cpu密集操作性的任务,适合io操作密集的任务
    '''
    import multiprocessing
    import time
    import threading
    
    # def threadrun():
    #     print threading._get_ident()
    #
    # def run(name):
    #     time.sleep(2)
    #     print 'hello',name
    #     t = threading.Thread(target=threadrun)     #进程里面再启动线程
    #     t.start()
    #
    # if __name__ ==  '__main__':
    #     for i in range(10):
    #         p = multiprocessing.Process(target=run,args=('zq%s'%i,))    #启动进程
    #         p.start()
    #     #p.join()
    #
    # #获取进程号
    # from multiprocessing import Process
    # import os
    #
    #
    # def info(title):
    #     print(title)
    #     print('module name:', __name__)
    #     print('parent process:', os.getppid())
    #     print('process id:', os.getpid())
    #     print("
    
    ")
    #
    #
    # def f(name):
    #     info('33[31;1mcalled from child process function f33[0m')
    #     print('hello', name)
    #
    # if __name__ == '__main__':
    #     info('33[32;1mmain process line33[0m')
    #     p = Process(target=f, args=('bob',))
    #     p.start()
    #     # p.join()
    #进程之间的通讯   线程之间的队列可以共享使用,但是进程之间不行,线程的队列不可以传给另一个进程使用
    #如果想使用,必须使用进程队列:Queue
    '''
    主进程将进程队列当做参数传给子进程,实际上是克隆一个进程队列给子进程,并不是共享,
    但是当主进程往主进程序列put东西的时候,主进程队列会通过pickle数据实例化把主进程
    队列的数据分享克隆给子进程的序列,
    '''
    
    # from multiprocessing  import Process
    # from multiprocessing  import Queue
    # def f(qq):
    #     qq.put([42,None,'zq'])
    #
    # if __name__ == '__main__':
    #     q = Queue()
    #     p = Process(target=f,args=(q,))
    #     p.start()
    #     print q.get()
    #     p.join()
    #两个进程之间通信的另一种方法:管道
    # from multiprocessing import Process,Pipe
    # def f(conn):
    #     conn.send(['12341','qweqwe'])
    #     conn.close()
    #
    # if __name__ == '__main__':
    #     parent_conn,child_conn = Pipe()
    #     p = Process(target=f,args=(child_conn,))
    #     p.start()
    #     print  parent_conn.recv()
    #     p.join()
    
    #两个进程之间分享数据之:manager    manager自带进程锁,不需要设置
    # from multiprocessing import Process,Manager
    # import os
    #
    # def f(dict1,list1):
    #     dict1[os.getpid()] = os.getpid()
    #     list1.append(os.getpid())
    #     print list1
    #
    # if __name__ == '__main__':
    #     with Manager() as manager:
    #         d = manager.dict()     #生成一个字典可以在多个进程之间传递和共享
    #         l= manager.list(range(5)) #生成一个列表可以在多个进程之间传递和共享
    #         p_objlist = []
    #         for i in range(10):
    #             p = Process(target=f,args=(d,l))
    #             p.start()
    #             p_objlist.append(p)
    #         for res in p_objlist:
    #             res.join()
    #
    #         print d
    #         print l
    
    #进程锁   用于屏幕共享,比如打印进程1的数据时候会插入进程2的数据
    # from multiprocessing import Process,Lock
    # def f(l,i):
    #     l.acquire()
    #     print ' I am %s'%i
    #     l.release()
    #
    # if __name__ == '__main__':
    #     lock= Lock()
    #     for num in range(100):
    #         Process(target=f,args=(lock,num)).start()
    
    #进程池   防止进程过多占用过多内存指定同时执行的进程数量,其他进程属于挂起状态
    from multiprocessing import Process,Pool
    import time
    import os
    def Foo(i):
        time.sleep(1)
        print 'in process',os.getpid()
        return i + 100,'a'
    
    def  Bar(arg):                #回调
        print 'exec done',arg,os.getpid()
    
    if __name__ == '__main__':
        pool = Pool(processes=3)    #允许进程池同时放入进程的数量
        print '主进程的ID:',os.getpid()
        for i in range(10):
            pool.apply_async(func=Foo,args=(i,),callback=Bar)  #callback为回调函数,每个子进程完成会干的事,在主进程中进行的  Foo的返回值的参数给了Bar函数
            #pool.apply()  #串行
        print 'end'
        pool.close()
        pool.join()     #必须先关闭进程池再join,顺序不能错,否则程序直接关闭
    
  • 相关阅读:
    elasticsearch 调整参数 调参 -- 副本 分片 读写流程 -- elasticsearch配置
    对创新的理解 -- 价值共生、协同生长
    update_by_query ingest pipeline
    create index pattern Forbidden error
    apache转发规则 + nginx location 正则匹配经典案例
    拨测ip+port 告警 telnet nc
    configMap简单理解
    sidecar收集Tomcat日志-普通用户
    使用DBeaver连接pheonix
    bladex开发自己的服务不推送服务器的方法
  • 原文地址:https://www.cnblogs.com/qiangayz/p/8627979.html
走看看 - 开发者的网上家园