一、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. 20170728xlVBA改转置一例

    Sub 导出() Dim Sht As Worksheet, ShtName As String Dim NextRow As Long, NextRow2 As Long Dim iRow As L ...

  2. mysql导入导出数据过大命令

    phpmyadmin 导入或者导出都是有限制的,当导入或者导出的数据会报错. 1.导入数据库 mysql -u root -p<备份文件的保存路径 eg: mysql -u root -p &l ...

  3. HDOJ1009

    #include "iostream" #include "algorithm" #include "cstdio" using names ...

  4. Oracle EBS供应商接口导入(转)

    原文地址 Oracle EBS供应商接口导入 1.供应商导入组成供应商导入主要分为供应商头信息导入.供应商地点信息导入.供应商联系人导入三个部分的信息,其他按实际需求进行添加.供应商头信息导入:导入供 ...

  5. quartz---springmvc的配置文件正合

    quartz---springmvc的配置文件正合 XML <beans xmlns="http://www.springframework.org/schema/beans" ...

  6. 对称点line

    2 线 题⽬描述 有一天rax看到了男神,有时可爱美丽的她派ypq去把yyqx抓回来给rax欣赏,但ypq和yyqx间隔了一条线,她必须跳到yyqx以前待得点的对称点才有可能抓到yyqx给出⼀条直线, ...

  7. oracle12c中新能优化新特性之热度图和自动数据优化

    1. Oracle12c热度图和自动数据优化 信息生命周期管理(ILM)是指在数据生命周期内管理它们的策略.依赖于数据的年龄和对应用的业务相关性,数据能被压缩,能被归档或移到低成本的存储上.简言之,I ...

  8. ThreadPoolExecutor类

    首先分析内部类:ThreadPoolExecutor$Worker //Worker对线程和任务做了一个封装,同时它又实现了Runnable接口, //所以Worker类的线程跑的是自身的run方法 ...

  9. 简话Angular 01 初识Angular 数据绑定

    1. Angular有哪些突出优点 1) MVC 基于Html-Javascript 2) 依赖注入 3) 数据双向绑定,响应式页面设计 4) 模块化,自定义指令 2. 简话数据绑定 1) 代码: & ...

  10. Python笔记初识

    Python笔记初识