进程and线程and协程效率对比

1.进程与进程池的效率对比

  • 多进程:p.start()过程中,只是向操作系统发送一个信号,至于什么时候执行,都是操作系统的事情,操作系统接收到信号时,帮该进程申请一块内存空间+拷贝父进程的地址空间
#多进程执行效率
from multiprocessing import Process
import time
def func(i):
    sum = 0
    time.sleep(1)
    sum += i
    print(sum)


if __name__ == '__main__':
    ls = []
    statt = time.time()
    for i in range(10):
        p = Process(target=func,args=((i,)))
        p.start()
        ls.append(p)
    [p.join() for p in ls]
    print(time.time() - statt)

#执行时间
1.3582112789154053
多进程的执行
  • 进程池:

    一个池子,里边有固定数量的进程。这些进程一直处于待命状态,一旦有任务来,马上就有进程去处理。
    因为在实际业务中,任务量是有多有少的,如果任务量特别的多,不可能要开对应那么多的进程数
    开启那么多进程首先就需要消耗大量的时间让操作系统来为你管理它。其次还需要消耗大量时间让
    cpu帮你调度它。
    进程池还会帮程序员去管理池中的进程

#进程池的效率
from concurrent.futures import ProcessPoolExecutor
from multiprocessing import Process
import time
def func(i):
    sum = 0
    time.sleep(1)
    sum += i
    return sum
ls = []
if __name__ == '__main__':
    p = ProcessPoolExecutor(4)
    start = time.time()

    for i in range(10):

        #向进程池中丢任务,这十个发送的信号会被直接添加到列表中
        #至于你执行不执行,那是操作系统的事,这时列表中就有了十个返回值对象
        obj = p.submit(func,i)
        ls.append(obj)

    #任务对象会在ls列表中依次排好顺序,然后p.result()会依次等待结果!
    [print(p.result()) for p in ls]
    print(time.time() - start)

    #上面列表等待的话,这里会一瞬间完成,因为上面代码中每个任务都已经执行结束
    p.shutdown(wait=True)
#时间效率
3.124636650085449
进程池的时间效率
  • 总结:
    如果在机器可承受范围内,进程数开的越多,执行效率越快!
    1.轻量级的任务多进程和进程池的执行效率相差不大;因为在开多进程时,开启进程的时间
    和cpu切换的时间可以忽略不计!
    2.任务量较大时,因为进程池里已经有开启好的进程,随时可以调度,节省了多进程开启进程的时间
    和资源利用率!

2.线程与进程效率对比

猜你喜欢

转载自www.cnblogs.com/0627zhou/p/9550076.html
今日推荐