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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM