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中的多进程模块multiprocessing的更多相关文章

  1. Python 中 logging 日志模块在多进程环境下的使用

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,Python 中 logging 日志模块在多进程环境下的使用 使用 Pytho ...

  2. python中日志logging模块的性能及多进程详解

    python中日志logging模块的性能及多进程详解 使用Python来写后台任务时,时常需要使用输出日志来记录程序运行的状态,并在发生错误时将错误的详细信息保存下来,以别调试和分析.Python的 ...

  3. Python中的多进程与多线程(二)

    在上一章中,学习了Python多进程编程的一些基本方法:使用跨平台多进程模块multiprocessing提供的Process.Pool.Queue.Lock.Pipe等类,实现子进程创建.进程池(批 ...

  4. Python中使用多进程来实现并行处理的方法小结

    进程和线程是计算机软件领域里很重要的概念,进程和线程有区别,也有着密切的联系,先来辨析一下这两个概念: 1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和 ...

  5. 聊聊Python中的多进程和多线程

    今天,想谈一下Python中的进程和线程. 最近在学习Django的时候,涉及到了多进程和多线程的知识点,所以想着一下把Python中的这块知识进行总结,所以系统地学习了一遍,将知识梳理如下. 1. ...

  6. 深入浅析python中的多进程、多线程、协程

    深入浅析python中的多进程.多线程.协程 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源 ...

  7. 多进程模块 multiprocessing

    由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程. multiprocessing包是Python中的多进程 ...

  8. Python中的random模块,来自于Capricorn的实验室

    Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...

  9. Python中的logging模块

    http://python.jobbole.com/86887/ 最近修改了项目里的logging相关功能,用到了python标准库里的logging模块,在此做一些记录.主要是从官方文档和stack ...

随机推荐

  1. [interview]螺旋队列问题

    摘要 本文主要讲解三种螺旋队列的实现方式和打印输出: 从中心往外端顺时针旋转,记为『外螺旋队列』 从左顶点开始,绕剩下的最大圈顺时针往内旋转,记为『内螺旋队列』 从左顶点开始,之字形旋转(只能同行同列 ...

  2. crm--01

    需求: 将课程名称与班级综合起来 class ClassListConfig(ModelSatrk): # 自定义显示方式 def display_class(self,obj=None,is_hea ...

  3. Underscore template

    /********************************************************************* * Underscore template * 说明: * ...

  4. SQL Server, Cannot resolve the collation conflict

    今天遇到一个较为头痛的问题: Cannot resolve the collation conflict between "Chinese_PRC_90_CI_AS" and &q ...

  5. appium-java,同时连接多台机器,启动微信

    1.配置appium信息 第一台机 第二台机类似,连接端口和监听端口不能重复 2.appium连接手机,微信中打开debugx5.qq.com,信息->TBS settings->是否打开 ...

  6. BZOJ3489 A simple rmq problem 【可持久化树套树】*

    BZOJ3489 A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一 ...

  7. java面试题08

    1.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1 = 1; s1 = s1 + 1;编译时错误.对于shor ...

  8. js去重复和取重复数据

    js数组中取重复数据的方法: 方法一:去重复数据 <script> Array.prototype.distinct=function(){ var a=[],b=[]; for(var ...

  9. 让控制台支持 ANSI 转义序列,输出下划线、修改颜色或其他控制

    各种操作系统的控制台都支持 ANSI 转义序列(ANSI Escape Code).使用转义序列,可以对控制台进行很多额外的定制,例如修改颜色.修改标题栏,将文字添加下划线等. 当然,.NET 已经帮 ...

  10. 服务器上通过FTP共享文件夹

    近日,公司某服务器共同操作的人员增多,而我只需访问及替换某些文件,故想到共享文件夹. 在IIS中建立ftp站点,添加虚拟目录(可多个,对应不同文件夹),设置允许访问的用户(添加用户,见在IIS上搭建F ...