zoukankan      html  css  js  c++  java
  • 多进程学习笔记

    #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,顺序不能错,否则程序直接关闭
    
  • 相关阅读:
    [ jquery 选择器 :hidden ] 此方法选取匹配所有不可见元素,或者type为hidden的元素
    剑指 Offer 03. 数组中重复的数字 哈希
    LeetCode 1736. 替换隐藏数字得到的最晚时间 贪心
    Leetcode 1552. 两球之间的磁力 二分
    Leetcode 88. 合并两个有序数组 双指针
    LeetCode 1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?
    LeetCode 1743. 相邻元素对还原数组 哈希
    LeetCode 1745. 回文串分割 IV dp
    剑指 Offer 47. 礼物的最大价值 dp
    剑指 Offer 33. 二叉搜索树的后序遍历序列 树的遍历
  • 原文地址:https://www.cnblogs.com/qiangayz/p/8627979.html
Copyright © 2011-2022 走看看