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()

 

 
posted @ 2018-12-03 09:39  aclover  阅读(2308)  评论(0编辑  收藏  举报