python进程与线程,同步与异步,并行并发

进程:(参考文章)https://blog.csdn.net/u014556057/article/details/61616902

  • 进程类 代码,可做模板
from multiprocessing import Process,Pool
import os
import time
class Myprocess(Process):
    def __init__(self,wTime):
        Process.__init__(self)
        self.wTime = wTime

    def run(self):
        n = 0
        while n<3:
            print('子进程{}正在运行'.format(os.getpid())),'{}'.format(time.ctime())
            time.sleep(self.wTime)
            n +=1

if __name__ == '__main__':
    p = Myprocess(2)
    p.daemon = True  # 守护进程(其父进程结束,子进程也直接终止运行)
    p.start()
    p.join()    #它使子进程执行结束后,父进程才执行之后的代码
    print('正在运行的进程',p.pid)
    print('进程结束,{}'.format(time.ctime()))
  • 进程池Pool
from multiprocessing import  Process,Pool
import os,time

def run_proc(name):
    for i in range(5):
        time.sleep(0.2)
        print('运行子进程{}({})'.format(name,os.getpid()))

if __name__ == '__main__':
    # os.getpid()获取当前进程id     os.getppid()获取父进程id
    print('运行主进程{}'.format(os.getpid()))
    mainStart = time.time()
    p = Pool(8)
    for i in range(16):
        p.apply_async(run_proc,args=('Process'+str(i),))

    print('等待所有进程执行完')
    p.close()
    p.join()
    print('所有进程已经执行完毕')
    mainEnd = time.time()
    print('所有进程执行的总时间是{}'.format(mainEnd-mainStart))

附加说明:这里进程池对并发进程的限制数量为8个,而程序运行时会产生16个进程,进程池将自动管理系统内进程的并发数量,其余进程将会在队列中等待。限制并发数量是因为,系统中并发的进程不是越多越好,并发进程太多,可能使CPU大部分的时间用于进程调度,而不是执行有效的计算。

采用多进程并发技术时,就单个处理机而言,其对进程的执行是串行的。但具体某个时刻哪个进程获得CPU资源而执行是不可预知的(如执行结果的开头部分,各进程的执行顺序不定),这就体现了进程的异步性。

如果单个程序执行14次run_proc函数,那么它会需要至少16秒,通过进程的并发,这里只需要2.49秒,可见并发的优势。

待续。。。

发布了22 篇原创文章 · 获赞 5 · 访问量 4407

猜你喜欢

转载自blog.csdn.net/HW0007/article/details/82459232