zoukankan      html  css  js  c++  java
  • python 进程创建和共享内容的方法

    1.使用Pool来创建进程

    from multiprocessing import Pool
    def f(n):
        return n*n
    if __name__=="__main__":
        p=Pool(5)
        a=range(10)
        print(p.map(f,a))

    p.map会将a列表中的数据依次循环给f函数。但是当函数需要两个参数时,该方法不适用。

    2.使用Process来创建进程

    def info(title):
        print title
        print 'module name:', __name__
        if hasattr(os, 'getppid'):  # only available on Unix
            print 'parent process:', os.getppid()
        print 'process id:', os.getpid()
    
    def f(name):
        info('function f')
        print 'hello', name
    
    if __name__ == '__main__':
        info('main line')
        p = Process(target=f, args=('bob',))
        p.start()
        p.join() #串行

    3.使用Pool.apply_async(异步)

    from multiprocessing import Pool
    import time
    
    def f(n):
        print n*n
        time.sleep(1)
        return n*n
    
    if __name__ == '__main__':
        p = Pool(processes=5)
        res_list = []
        for i in range(10):
            res = p.apply_async(f,[i,])
            res_list.append(res)
    
        for item in res_list:
            print item.get()

    共享内存的三种方法

    1.使用multiprocessing中的Queue(将Queue封装了)

    from multiprocessing import Process, Queue
    import Queue as Q2
    def f(q,n):
        q.put([n, 'hello'])
        print q.get() 
    if __name__ == '__main__':
        q = Q2.Queue()
        for i in range(5):
            p = Process(target=f, args=(q,i))
            p.start()
     #   print q.get()    # prints "[42, None, 'hello']"
    
    from multiprocessing import Process, Lock
    import time
    def f(i):
      #  l.acquire()
        time.sleep(1)
        print 'hello world', i
       # l.release()
    
    if __name__ == '__main__':
       # lock = Lock()
        for num in range(10):
            Process(target=f, args=[num]).start()

    2.使用values和array(灵活性较差,不推荐使用)

    from multiprocessing import Process, Value, Array
    
    def f(n, a):
        n.value = 3.1415927
        for i in range(len(a)):
            a[i] = -a[i]
    
    if __name__ == '__main__':
        num = Value('d', 0.0)
        arr = Array('i', range(10))
    
        p = Process(target=f, args=(num, arr))
        p.start()
        p.join()
    
        print num.value
        print arr[:]

    3.使用Manager

    from multiprocessing import Process, Manager
    
    def f(d, l):
        d[1] = '1'
        d['2'] = 2
        d[0.25] = None
        l.reverse()
    
    if __name__ == '__main__':
        manager = Manager()
    
        d = manager.dict()
        l = manager.list(range(10))
    
        p = Process(target=f, args=(d, l))
        p.start()
        p.join()
    
        print d
        print l
  • 相关阅读:
    Symantec Backup Exec Agent For Linux防火墙问题
    GConf error:Failed to contact configuration server
    【转载】latch: cache buffers chains
    MS SQL 监控错误日志的告警信息
    ORA-14450: attempt to access a transactional temp table already in use
    VMware下Windows Server 2012添加新磁盘
    fdisk添加分区引起的Linux Error: 22: Invalid argument
    shell脚本执行时报"bad interpreter: Text file busy"的解决方法
    你真的懂redis的数据结构了吗?redis内部数据结构和外部数据结构揭秘
    spring boot面试问题集锦
  • 原文地址:https://www.cnblogs.com/white-small/p/6442249.html
Copyright © 2011-2022 走看看