• 关于python中的多进程模块multiprocessing


    python中的multiprocessing是一个多进程管理包,主要作用也就是提供多进程,而不是多线程,在其中用的比较多估计也就是Process和Pipe两个类,如下代码所示:

    #!/usr/bin/env python
    
    from multiprocessing import Process,Pipe
    
    def fun(pipe,x):
        pipe.send('hello,'+x)
    
    reciver,sender = Pipe() 
    proc = Process(target=fun,args=(sender,'kel',)) #传递参数为sender,其实传递的是reciver也是可以的
    proc.start()
    print reciver.recv()
    proc.join()
    print reciver.recv() #在等待接收
    在创建Pipe()对象的时候,可以使用两个部分,一个是用来接收的,一个是用来发送的,如上的构造对象中,两者均可以用来发送和接收。

    执行结果如下:

    [root@python 55]# python simplePipe.py 
    hello,kel
    发送的时候,发送的消息为kel然后返回值为hello,kel


    创建Pipe的时候,返回的是一对对象,如下所示:

    >>> from multiprocessing import Pipe
    >>> p=Pipe()
    >>> p
    (<read-write Connection, handle 6>, <read-write Connection, handle 7>)
    返回的都是可读可写的。


    在multiprocessing的多进程管理中,主要是用Process来创建进程,从而来创建多进程的环境,也就是上面的例子代码Process

    使用start方法来开启进程,使用join方法来结束进程


    Process的语法结果如下:

    class multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={})
    
    一般需要指定的参数为target,表示为一个函数,这个函数必须是可调用的,args表示为target的参数,是一个元组的格式。注意在只有一个参数的时候,必须写上逗号,表示为一个tuple


    >>> from multiprocessing import Process
    >>> import time
    >>> def kel():
    ...  time.sleep(20)
    ... 
    >>> proc=Process(target=kel,args=())
    >>> proc.pid #进程未开始的时候,pid为None
    >>> proc.is_alive() #查看进程是否活动
    False
    >>> proc.start() #进程开始运行
    >>> proc.pid
    6117
    >>> proc.is_alive()
    True
    >>> proc.is_alive() #程序执行完毕,进程自动关闭
    False
    >>> proc.join()


    在操作系统层面,也是可以直接获取到进程,如下所示:

    [root@python ~]# ps -ef|grep 6117
    root      6117  6114  0 09:36 pts/1    00:00:00 python
    root      6121  6091  0 09:36 pts/3    00:00:00 grep 6117


    Pipe的语法如下:

    multiprocessing.Pipe([duplex])

    Pipe和Process配合,可以开启一个进程,然后读取函数执行的返回信息

    当需要有多个进程的时候,可以使用如下的方式:

    from multiprocessing import Pipe,Process
    
    class Pool(object):
        @classmethod
        def spawn(cls,f):
            def fun(pipe,x):
                pipe.send(f(x))
                pipe.close()
            return fun
    
        @classmethod
        def partmap(cls,f,X):
            pipe = [Pipe() for x in X]
            proc = [Process(target=cls.spawn(f),args=(c,x)) for x,(p,c) in zip(X,pipe)]
            [p.start() for p in proc]
            [p.join() for p in proc]
            return [p.recv() for p,m in pipe]
    
    def kel(x):
        return 'hello,',x
    
    print Pool.partmap(kel,['kel','smile'])

    执行结果如下:

    [('hello,', 'kel'), ('hello,', 'smile')]
    主要是开启多个进程来执行相关的函数,在其中使用了闭包,主要就是执行这个函数,并且通过pipe来传递相关的消息





  • 相关阅读:
    将Python的Django框架与认证系统整合的方法
    将Python的Django框架与认证系统整合的方法
    Python的Asyncore异步Socket模块及实现端口转发的例子
    每天一个linux命令(3):du命令
    每天一个linux命令(2):file 命令
    Ubantu 使用extundelete恢复数据
    ubantu 单用户模式进入系统
    GDB 调试解析
    服务器搭建5 Samba实现文件共享
    服务器搭建4 安装其它库
  • 原文地址:https://www.cnblogs.com/kellyseeme/p/5525032.html
Copyright © 2020-2023  润新知