Python学习总结之四 多进程

一:启动多进程

1.1 multiprocessing是一个跨平台的python包,因此我们使用该工具包进行多进程的开发.
from multiprocessing import Process
#子进程需要执行的代码
def run(str):
   while True:
       # os.getpid()获取当前进程id号
       # os.getppid()获取当前进程的父进程id号
       print(" %s--%s--%s"%(str, os.getpid(),os.getppid()))
       sleep(1)
#创建子进程
#target说明进程执行的任务
p = Process(target=run, args=("test",))
#启动进程
p.start()
#父进程的结束不能影响子进程,让父进程等待子进程结束再执行父进程
process.join()
1.2利用进程池生成进程.

开多进程是为了并发,通常有几个cpu核心就开几个进程,但是进程开多了会影响效率,主要体现在切换的开销,所以引入进程池限制进程的数量。

进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,初始化一个Pool时,可以指定一个最大进程数,如果超过这个数,那么请求就会等待,直到池中有进程结束,才会创建新的进程来执行

from multiprocessing import Pool
import os, time, random
def run(name):
   print("子进程%d启动--%s" % (name, os.getpid()))
if __name__ == "__main__":
   #创建多个进程
   #进程池
   #表示可以同时执行的进程数量
   #Pool默认大小是CPU核心数
   pp = Pool(2)
   for i in range(3):
       #创建进程,放入进程池同意管理
       pp.apply_async(run,args=(i,))

   #在调用join之前必须先调用close,调用close之后就不能再继续添加新的进程了
   pp.close()
   #进程池对象调用join,会等待进程池中所有的子进程结束完毕再去执行父进程
   pp.join()

二,多进程之间的通信.

进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的。

2.1进程队列queue
from multiprocessing import Process, Queue
import os, time

def write(q):
    print("启动写子进程%s" % (os.getpid()))
    q.put("A")
    print("结束写子进程%s" % (os.getpid()))

def read(q):
    print("启动读子进程%s" % (os.getpid()))
    while True:
        value = q.get(True)
        print("value = " + value)
    print("结束读子进程%s" % (os.getpid()))


if __name__ == "__main__":
    #父进程创建队列,并传递给子进程
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))

    pw.start()
    pr.start()

    pw.join()
    #pr进程里是个死循环,无法等待其结束,只能强行结束
    pr.terminate()

    print("父进程结束")

2.2进程池中的Queue

如果使用进程池pool创建进程的话,就需要使用Manager().Queue()

from multiprocessing import Manager, Process, Pool
import threading
import random, time,os


# queue,实现多进程之间的数据传递,其实就是个消息队列

def write(q):
    print('---write thread is %s' % os.getpid())
    for value in ['A', 'B', 'C']:
        print("put %s to queue" % value)
        q.put(value)


def read(q):
    print('---read thread is %s' % os.getpid())
    for i in range(q.qsize()):
        print("Get value is %s" % q.get(True))


if '__main__' == __name__:
    print('---main thread is %s' % os.getpid())
    q = Manager().Queue()
    po = Pool()
    po.apply(write, args=(q,))
    po.apply(read, args=(q,))
    po.close()
    po.join()
    print('---end---')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、进程的概念 相信很多同学都听说过windows、linux,MacOS都是多任务,多用户的操作系统。那什么是多...
    转身后的那一回眸阅读 1,072评论 0 1
  • 现在, 多核CPU已经非常普及了, 但是, 即使过去的单核CPU, 也可以执行多任务。 CPU执行代码都是顺序执行...
    LittlePy阅读 4,907评论 0 3
  • 1.进程和线程 1.1系统多任务机制 多任务操作机制的引入主要是在相同的硬件资源下怎么提高任务处理效率的!多任务的...
    _宁采臣阅读 1,113评论 0 6
  • 进程进程的概念是需要理解的,进程是操作系统中正在运行的一个程序实例,操作系统通过进程操作原语来对其进行调度。操作系...
    zhile_doing阅读 542评论 0 0
  • 自从可视化编程处理,人们便对这个争议不断。对于这两种方法,各有各的优缺点吧。 咱们先来说说可视化编程。 它的优点就...
    LGirl阅读 1,802评论 0 0

友情链接更多精彩内容