文档章节

python多进程编程multiprocessing

Goopand
 Goopand
发布于 2015/06/13 23:23
字数 763
阅读 29
收藏 0

python支持多线程多进程编程,标准库模块threading使得python的多线程编程变得容易,支持很多功能,在python2.6后,python新添加了多进程的标准库模块multiprocessing,功能非常类似threading。

下面介绍multiprocessing模块的一些常用类和方法。

1、multiprocessing.Process

该类原型如下:

class multiprocessing.Process(group=Nonetarget=Nonename=Noneargs=()kwargs={})

group参数通常为None,仅仅是为兼容threading.Thread。

target为可调用对象,被run()函数调用,一般用法就是将函数传给该参数,交给子进程运行。

name为进程名,如不指定,默认为Process-1,Process-2....这样的名字,数字随自己查数量依次递增。

args为target调用的参数元祖。

kwargs为target调用的关键字参数字典。

Process类生成一个process对象,并运行在一个新的单独的进程内。

一个简单的使用例子:

from multiprocessing import Process
import time

def timetask(times):
    time.sleep(times)
    print time.localtime()

if __name__ == '__main__':
    arg = 5
    p = Process(target = timetask, args = (arg,))
    p.start()
    p.join()

每个process对象最多只能调用一次start()方法,join([timeout])方法会阻塞调用process对象的进程,直到timeout时间超时,或者process进程退出。如果timeout设置为None,则无超时时间。对于linux操作系统的进程管理,父进程会等待子进程退出,并收回子进程的资源,然后父进程再退出。如果父进程先于子进程退出,则子进程会被init进程接管。如果父进程没有退出也没有回收子进程资源,则子进程会一直停留在僵死状态。这里join方法就是阻塞父进程,等待子进程执行完毕。

如果在子进程里面要接受标准输入(如调用raw_input函数),这时候会有问题。因为标准输入是被父进程占用,因此这里子进程无法从标准输入读取数据。

一个解决办法是将标准输入描述符,传入子进程函数:

from multiprocessing import Process
import sys, os
import time

def intask(x, fileno):
    sys.stdin = os.fdopen(fileno)
    while True:
        in_char = raw_input("Enter to continue, Q to quit: ")
        if in_char.upper() == 'Q':
            break
        print x * x

if __name__ == '__main__':
    fn = sys.stdin.fileno()
    arg = 5
    p = Process(target = intask, args = (arg, fn))
    p.start()
    p.join()

开启多个进程并行执行:

from multiprocessing import Process
import sys, os
import time

def timetask(times):
    time.sleep(times)
    print time.localtime()


def works(func, arg, worknum):
    proc_record = []
    for i in range(worknum):
        p = Process(target = func, args = (arg,))
        p.start()
        proc_record.append(p)
    for p in proc_record:
        p.join()

    
if __name__ == '__main__':
    arg = 5
    procs = 4
    works(timetask, arg, procs)

程序同时开启4个进程并行执行timetask函数,这里需要注意的是先把所有的进程对象执行了start()方法后,再执行join(),如果对每个进程对象一起执行start()和join(),那么单个进程对象start()后,会马上阻塞父进程,导致无法马上对下一个进程对象执行start()。结果就是子进程并不是并行运行,而是依次运行。

有时间再更新multiprocessing模块的其他类和方法


本文转载自:http://www.cnblogs.com/yanvcl/archive/2013/06/07/3123897.html

共有 人打赏支持
Goopand
粉丝 8
博文 392
码字总数 196343
作品 0
朝阳
Python 2.6 亮点:multiprocessing模块

本来以为Python 2.6只是Python 3.0的过渡版本,不会有太多的新功能。但看到这个2.6的重大改动列表,才发现自己挺落后的。在2.6中新增的multiprocessing模块也绝对是Python 2.6的杀手级应用(...

索隆
2012/05/02
0
0
python--多进程的用法详解实例

想让python实现多进程(multiprocessing),我们要先区分不同的操作系统的不同之处。 Linux操作系统下提供了一个fork()系统调用,普通函数调用一次返回一次,fork()调用一次返回两次,因为操作...

山有木兮有木兮
05/14
0
0
浅谈 python multiprocessing(多进程)下如何共享变量

1、问题: 群中有同学贴了如下一段代码,问为何 list 最后打印的是空值? 其实如果你了解 python 的多线程模型,GIL 问题,然后了解多线程、多进程原理,上述问题不难回答,不过如果你不知道...

大数据之路
2014/02/26
0
0
python多进程并发之multiprocessing

Python并发之多进程 -- multiprocessing multiprocessing包是Python中的多进程管理包。 它与 threading.Thread类似,可以利用multiprocessing.Process对象来创建一个进程。该进程可以允许放在...

_Change_
2017/11/03
0
0
python --- mulitprocessing(多进程)模块使用

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

码农47
2017/11/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Coding and Paper Letter(三十九)

资源整理。 1 Coding: 1.Python库benchmark rio s3,用于在访问S3上的文件时对Rasterio / GDAL的多线程性能进行基准测试的工具。 benchmark rio s3 2.Pangeo-Binder Cookiecutter模板。 cook...

胖胖雕
34分钟前
1
0
Promise 对象

Promise(承诺) 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供...

简心
37分钟前
0
0
让UI设计师崩溃的瞬间,你经历过哪些?

隔行如隔山,这句话人人耳熟能详,但其实隔行并不可怕,大家各谋其事,各尽其职,倒也互不打扰,真正可怕的是,是内行还要受外行指点江山,而最难的部分,便是那沟通。流畅的沟通,和声细语,...

mo311
39分钟前
1
0
python进制转换

#进制转换print(bin(10)) #十进制转换成二进制print(oct(10)) #十进制转换成八进制print(hex(10)) #十进制转换成十六进制print(int('1010',2)) #二进制转十进制print(int(...

fadsaa
50分钟前
3
0
syntax error near unexpected token

最近不断重复在虚拟机CentOS测试安装gitlab,因为gitlab有一个脚本需要饭强才能下载,于是我先在windows下载好再上传到虚拟机,可是执行脚本的时候提示“syntax error near unexpected toke...

W_Lu
59分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部