一、multiprocessing模块简介——进程基于“threading”的接口

multiprocessing模块支持创建进程——使用threading模块相似的API。multiprocessing模块对本地和远程的并发都提供了支持,使用子进程(subprocesses)来替代threads解决了GIL的限制。因此,multiprocessing模块允许程序充分利用给定设备的多核资源。在Unix和Windows系统都可以运行。

multiprocessing模块同样引入了threading模块不支持的APIs。主要例子如:Pool对象提供了便捷并行执行(有多输入)的函数的执行,通过进程分发输入数据。下面就是一个简单的数据分发。

from multiprocessing import Pool

def f(x):
return x*x if __name__ == '__main__':
p = Pool(5)
print(p.map(f, [1, 2, 3]))

样例

二、Process类

在multiprocessing模块中,processes可以通过创建一个Process对象产生。然后调用其start()方法。Process和threading.Thread遵循threading.Thread的API。一个简单的多线程例子如下

from multiprocessing import Process

def f(name):
print 'hello', name if __name__ == '__main__':
p = Process(target=f, args=('bob',))
p.start()
p.join()

样例

显示相应的单个进程IDs,如下:

from multiprocessing import Process
import os
import time def info(title):
print(title)
print('module name:', __name__)
if hasattr(os, 'getppid'):
print('parent process:',os.getppid())
print('process id:', os.getpid()) def f(name):
time.sleep(2)
info('function f')
print('hello', name) if __name__ == '__main__': info('main line')
p = Process(target=f,args=('bob',))
p.start()
p.join()

样例

三、Exchanging objects between processes进程间通讯

1、Queue基本上是Queue.Queue的克隆版,但是本Queue是线程和进程都安全的

from multiprocessing import Process, Queue
import time def f(q):
time.sleep(2)
q.put([42, None, 'hello'])
print('f') if __name__ == '__main__':
q = Queue()
p = Process(target=f, args=(q,))
p.start()
p.join()
print('hello')
print(q.get())

样例

2、Pipes是Pipe()函数返回一个连接对象对——由一个pipe连接,默认是双工(两种方式)

from multiprocessing import Process, Pipe

def f(conn):
conn.send([42, None, 'hello'])
conn.close() if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
print(parent_conn.recv())
p.join()

样例

Pipe()返回两个连接(Connection)对象,代表管道的两端。每个连接对象都有send()和recv()方法(彼此之间)。

注意:如果两个线程(或进程)同时尝试从pipe的同一端读写数据,管道里的数据可能损坏。如果同时在pipe()的两端读写是没有风险的。

四、进程间的同步机制

multiprocessing拥有threading模块相同的同步机制。例如,可以使用lock来保证一次只有一个进程打印到标准输出。

from multiprocessing import Process,Lock
import time def f(l, i):
l.acquire()
# time.sleep(2)
print('hello world', i)
l.release() if __name__ == '__main__':
lock = Lock() for num in range(10):
Process(target=f,args=(lock, num)).start()

利用锁线程同步

五、进程间共享状态

如上所述,我们在做并发编程时,应当尽可能避免使用共享状态。有其是多进程。然而,你非得在多进程使用共享数据,multiprocessing提供了几种方来实现。

1、Shared memory共享内存

数据可以存储在共享内存里使用Value或Array。例如,如下代码:

Python之进程(multiprocessing)的更多相关文章

  1. Python 线程(threading) 进程(multiprocessing)

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  2. Python多进程库multiprocessing中进程池Pool类的使用[转]

    from:http://blog.csdn.net/jinping_shi/article/details/52433867 Python多进程库multiprocessing中进程池Pool类的使用 ...

  3. python学习笔记——multiprocessing 多进程组件 进程池Pool

    1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成 ...

  4. Python多进程库multiprocessing创建进程以及进程池Pool类的使用

    问题起因最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有topic的regressor得到总得预测结果.没错!类似bag ...

  5. python 开启进程两种方法 multiprocessing模块 介绍

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu\_count\(\)查看),在python中大部分情况需要使用多进 ...

  6. Python:进程

    由于GIL的存在,python一个进程同时只能执行一个线程.因此在python开发时,计算密集型的程序常用多进程,IO密集型的使用多线程 1.多进程创建: #创建方法1:将要执行的方法作为参数传给Pr ...

  7. Python中的multiprocessing和threading

    Python中的multiprocessing和threading分别使用来实现多进程编程和多线程编程的.其中threading比较简单,而前者比较繁琐. 下面,我们进行一下分析: 多线程--thre ...

  8. Python多进程并发(multiprocessing)用法实例详解

    http://www.jb51.net/article/67116.htm 本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Pyt ...

  9. python 标准库 -- multiprocessing

    multiprocessing 与 threading.Thread 类似 multiprocessing.Process 创建进程, 该进程可以运行用 python 编写的函数. multiproc ...

  10. Python之进程

    进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代 ...

随机推荐

  1. HTML提交方式post和get区别(实验)

    HTML提交方式post和get区别(实验) 一.post和get区别 get提交,提交的信息都显示在地址栏中. post提交,提交的信息不显示地址栏中,显示在消息体中. 二.客户端代码 <!D ...

  2. hdu-6319-单调队列

    Problem A. Ascending Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K ...

  3. C#窗体控件简介ListBox(需整理)

    ListBox 控件 ListBox 控件又称列表框,它显示一个项目列表供用户选择.在列表框中,用户 一次可以选择一项,也可以选择多项. 1.常用属性: (1) Items属性: 用于存放列表框中的列 ...

  4. .net 外部CSS文件不起作用总结

    外部css文件样式全部不起作用 asp.net 页面引用路径的问题 缺少必须属性<link rel="stylesheet" type="text/css" ...

  5. (转)使用UTL_SMTP包发送邮件

    使用UTL_SMTP包发送邮件 参考文档 Email From Oracle PL/SQL (UTL_SMTP) UTL_SMTP Oracle 存储过程中发送邮件,并支持用户验证.中文标题和内容

  6. Animation同时改变多个属性的动画

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>    < ...

  7. splunk LB和scale(根本在于分布式扩展index,search)

    Forwarder deployment topologies You can deploy forwarders in a wide variety of scenarios. This topic ...

  8. 【webpack系列】1 What is webpack?

    什么是webpack? 现今的网页可以看做是功能丰富的应用,拥有着复杂的js代码和一大堆依赖包.为了简化开发的复杂程度,有了很多好用的实践方法 模块化 让我们可以把复杂的程序细化为小的文件 类似于Ty ...

  9. entest1

      1◆ ai I   2◆ ai I ir ɜː ie i:   3◆ u: ʌ ɜː ə   ui u: ure ʊə

  10. PHP:第二章——PHP中的foreach语句

    foreach语句提供了遍历数组的 <?php header("Content-Type:text/html;charset=utf-8"); $arr=array(&quo ...