溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

multiprocessing模塊的多進(jìn)程與進(jìn)程池

發(fā)布時(shí)間:2020-08-31 02:02:30 來源:網(wǎng)絡(luò) 閱讀:554 作者:dorebmoon 欄目:編程語言

multiprocessing模塊的Process方法

可以利用Proces方法在一個(gè)主進(jìn)程中創(chuàng)建幾個(gè)子進(jìn)程

from multiprocessing import Process
import time
def f1(name):
    time.sleep(2)
    print('Hell %s' % name)
def f2(age):
    time.sleep(2)
    print('Hell %s' % age)
if __name__ == "__main__":
    p = Process(target=f1,args=('ayu',))
    p.daemon = True #將daemon設(shè)置為True,則主進(jìn)程不等待子進(jìn)程,主進(jìn)程結(jié)束,則整個(gè)進(jìn)程結(jié)束    
    p.start()
    p = Process(target=f2,args=('22',))
    p.daemon = True
    p.start()
    print('All Done') #子進(jìn)程結(jié)束后會輸出

###進(jìn)程間的內(nèi)存是不共享的

from multiprocessing import Process
li = []
def ad(i):
    li.append(i)
    print(li)
if __name__ == "__main__":
    for i in range(10):
        p = Process(target=ad,args=(i))
        p.start()
/Users/wuxiangyu-pc/.conda/envs/test_all/bin/python /Users/wuxiangyu-pc/Documents/spider/test_all/fork_process.py
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]

說明各個(gè)進(jìn)程間,內(nèi)存是不能共享的
但是線程之間內(nèi)存是可以共享的,所以可以使用threading操作

from threading import Thread
li = []
def ad(i):
    li.append(i)
    print(li)
if __name__ == "__main__":
    for i in range(10):
        p = Thread(target=ad,args=(i,))
        p.start()
/Users/wuxiangyu-pc/.conda/envs/test_all/bin/python /Users/wuxiangyu-pc/Documents/spider/test_all/fork_process.py
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Process finished with exit code 0

要實(shí)現(xiàn)進(jìn)程間的內(nèi)存共享,可以使用Manager方法

from multiprocessing import Process,Manager
def ad(i,li):
    li.append(i)
    print(li)
if __name__ == "__main__":
    manager = Manager()
    li = manager.li()
    for i in range(10):
        p = Process(target=ad,args=(i,li))
        p.start()
        p.join()
/Users/wuxiangyu-pc/.conda/envs/test_all/bin/python /Users/wuxiangyu-pc/Documents/spider/test_all/fork_process.py
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Process finished with exit code 0

##multiprocessing模塊的Pool進(jìn)程池
Pool.apply方法可以實(shí)現(xiàn)多個(gè)子進(jìn)程排序依次執(zhí)行

from multiprocessing import Pool
import time
def f0(name):
    time.sleep(2)
    print('i am %s' % name)
if __name__ == "__main__":
    p = Pool(5)
    for i in range(5):
        p.apply(func=f0,args=(i,))
        print('Hello World')
    p.close()
    p.join()

Pool.apply_async實(shí)現(xiàn)多線程異步,比apply多一個(gè)回調(diào)函數(shù)

from multiprocessing import Pool
def f1(num):
    i = num + 20
    return i
def f1(i):
    print('i am %s' % i)
if __name__ == "__main__":
    p = Pool(5)
    for i in range(5):
        p.apply_async(func=f1,args=(i,),callback=f1)
    p.close()
    p.join()
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI