python3多進程 進程池 協程並發


一、進程

           我們電腦的應用程序,都是進程,進程是資源分配的單位。進程切換需要的資源最大,效率低。
        進程之間相互獨立
        cpu密集的時候適合用多進程

#多進程並發

import multiprocessing
from multiprocessing import Pool
import time
def test1():
    for i in range(10):
        time.sleep(1)
        print('test', i)
 
def test2():
    for i in range(10):
        time.sleep(1)
        print('test', i)
 
if __name__ == '__main__':
    p1 = multiprocessing.Process(target=test1)
    p2 = multiprocessing.Process(target=test2)
    p1.start()
    p2.start()

 

#進程之間不共享

import multiprocessing
from multiprocessing import Pool
import time
import threading
g_num = 0
def test1():
    global g_num
    for i in range(10):
        g_num += 1
def test2():
    print(g_num)
if __name__ == '__main__':
    p1 = multiprocessing.Process(target=test1)
    p2 = multiprocessing.Process(target=test2)
    p1.start()
    p1.join()
    p2.start()
結果是 0 
 

二、進程池

        python中,進程池內部會維護一個進程序列,當需要時,程序會去進程池中獲取一個進程,如果進程池序列中沒有可供使用的進程,那么程序就會等待,直到進程池中有可用的進程為止。

#進程池實現並發

import multiprocessing
from multiprocessing import Pool
import time
import threading
g_num = 0
def test1():
    for i in range(10):
        time.sleep(1)
        print('test1',i)
def test2():
    for i in range(10):
        time.sleep(1)
        print('test2',i)
 
if __name__ == '__main__':
    pool = Pool(2)    # 允許進程池里同時放入2個進程 其他多余的進程處於掛起狀態
    pool.apply_async(test1)      
    pool.apply_async(test2)
    pool.close()  # close() 必須在join()前被調用
    pool.join()    # 進程池中進程執行完畢后再關閉,如果注釋,那么程序直接關閉。

join() 方法實現進程間的同步,等待所有進程退出。 close() 用來阻止多余的進程涌入進程池 Pool 造成進程阻塞。 apply_async()本身就可以返回被進程調用的函 數的返回值 

 

三、 協程:

        協程相對獨立,有自己的上下文,但其切換由自己控制,由當前協程切換到其他協程由協程來控制。而線程的切換由系統控制。  協程切換需要的資源很小,效率高
  多進程、多線程根據cpu核數不一樣可能是並行的,但是協程在一個線程中

#協程,自動切換(可以在test2sleep的時候切換去執行test1)

import gevent,time
from gevent import monkey    
monkey.patch_all()   #gevent三行放在其他所有import語句之前可以避免出現警告或者報錯信息,導致程序不能正常運行
def test1():
    for i in range(10):
        time.sleep(1)
        print('test1',1)
 
def test2():
    for i in range(10):
        time.sleep(2)
        print('test2',2)
g1 = gevent.spawn(test1)
g2 = gevent.spawn(test2)
g1.join()
g2.join()

 

 


免責聲明!

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



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