返回顶部
首页 > 资讯 > 后端开发 > Python >Python的multiprocessi
  • 615
分享到

Python的multiprocessi

Pythonmultiprocessi 2023-01-31 00:01:08 615人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

1.基本介绍multiprocessing模块可以衍生出子进程。multiprocessing模块同时提供本地和远程的并发操作。multiprocessing模块不像threading模块那样会受到GIL全局解释器锁的限制,它使用进程代替线


1.基本介绍

multiprocessing模块可以衍生出子进程。multiprocessing模块同时提供本地和远程的并发操作。multiprocessing模块不像threading模块那样会受到GIL全局解释器的限制,它使用进程代替线程。基于这样的特性,multiprocessing模块可以让程序员在一台服务器上使用多个处理器。

In [106]: from multiprocessing import Pool

In [107]: def f(x):
   .....:     return x*x;
   .....: 

In [108]: if __name__ == '__main__':
   .....:     p=Pool(5)
   .....:     print(p.map(f,[1,2,3]))
   .....:     
[1, 4, 9]



在multiprocessing模块中,子进程是通过一个Process对象生成的。然后调用start()函数

In [116]: from multiprocessing import Process

In [117]: def f(name):
   .....:     print 'hello',name
   .....:     

In [118]: if __name__ == '__main__':
   .....:     p=Process(target=f,args=('john',))
   .....:     p.start()
   .....:     p.join()
   .....:     
hello john


如果要查看各自的进程ID,可以使用以下代码

#!/usr/sbin/python

from multiprocessing import Process
import os

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):
    info('function f')
    print 'hello',name

if __name__ == '__main__':
   info('main line')
   p = Process(target=f,args=('john',))
   p.start()
   p.join()


main line
module name: __main__
parent process: 17148
process id: 18168
function f
module name: __main__
parent process: 18168
process id: 18169
hello john


2.进程间通信

multiprocessing模块支持Queues和Pipes两种方式来进行进程间通信

使用Queue

In [123]: from multiprocessing import Process,Queue

In [124]: def f(q):
   .....:     q.put([42,None,'hello'])
   .....:     

In [125]: if __name__ == '__main__':
   .....:     q=Queue()
   .....:     p=Process(target=f,args=(q,))
   .....:     p.start()
   .....:     print q.get()
   .....:     p.join()
   .....:     
[42, None, 'hello']


使用Queues,对于线程和进程来说都是安全



使用Pipe

In [136]: from multiprocessing import Process,Pipe

In [137]: def f(conn):
   .....:     conn.send([42,None,'hello'])
   .....:     conn.close()
   .....:     

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


Pipe()返回一对连接对象,这两个连接对象分别代表Pipe的两端。每个连接对象都有send()和recv()方法。需要注意的是如果两个不同的进程在同一时间对同一个Pipe的末端或者连接对象进行读写操作,那么Pipe中的数据可能被损坏。不同的进程在不同的末端同一时间读写数据不会造成数据损坏。


3.进程间同步

In [143]: from multiprocessing import Process,Lock

In [144]: def f(l,i):
               l.acquire()
               print 'hello world',i
               l.release()
   .....:     

In [145]: if __name__ == '__main__':
               lock=Lock()
               for num in range(10):
                   Process(target=f,args=(lock,num)).start()
   .....:         
hello world 0
hello world 1
hello world 2
hello world 3
hello world 4
hello world 5
hello world 6
hello world 7
hello world 8
hello world 9



4.进程间共享状态信息

在进行并发编程的过程中,尽量不要使用共享状态。如果一定要在进程间共享数据,multiprocessing模块提供了一些方法。

共享内存

In [11]: from multiprocessing import Process,Value,Array

In [12]: def f(n,a):
   ....:     n.value=3.1415927
   ....:     for i in range(len(a)):
   ....:         a[i] = -a[i]
   ....:         

In [13]: if __name__ == '__main__':
   ....:     num=Value('d',0.0)
   ....:     arr=Array('i',range(10))
   ....:     p=Process(target=f,args=(num,arr))
   ....:     p.start()
   ....:     p.join()
   ....:     print num.value
   ....:     print arr[:]
   ....:     
3.1415927
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]




共享进程

In [27]: from multiprocessing import Process,Manager

In [28]: def f(d,l):
            d[1] = '1'
            d['2']=2
            d[0.25]=None
            l.reverse()
   ....:     

In [29]: if __name__ == '__main__':
    manager=Manager()
    d=manager.dict()
    l=manager.list(range(10))
    p=Process(target=f,args=(d,l))
    p.start()
    p.join()
    print d
    print l
   ....:     
{0.25: None, 1: '1', '2': 2}
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]



5.使用一组工作进程

使用Pool对象会创建一组worker进程

from multiprocessing import Pool, TimeoutErrorimport timeimport osdef f(x):
    return x*xif __name__ == '__main__':
    pool = Pool(processes=4)              # start 4 worker processes

    # print "[0, 1, 4,..., 81]"
    print pool.map(f, range(10))

    # print same numbers in arbitrary order
    for i in pool.imap_unordered(f, range(10)):
        print i

    # evaluate "f(20)" asynchronously
    res = pool.apply_async(f, (20,))      # runs in *only* one process
    print res.get(timeout=1)              # prints "400"

    # evaluate "os.getpid()" asynchronously
    res = pool.apply_async(os.getpid, ()) # runs in *only* one process
    print res.get(timeout=1)              # prints the PID of that process

    # launching multiple evaluations asynchronously *may* use more processes
    multiple_results = [pool.apply_async(os.getpid, ()) for i in range(4)]
    print [res.get(timeout=1) for res in multiple_results]

    # make a single worker sleep for 10 secs
    res = pool.apply_async(time.sleep, (10,))
    try:
        print res.get(timeout=1)
    except TimeoutError:
        print "We lacked patience and Got a multiprocessing.TimeoutError"



[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
0
1
4
9
25
36
64
49
81
16
400
27150
[27149, 27152, 27151, 27150]
We lacked patience and got a multiprocessing.TimeoutError



Pool对象的函数只能是创建它的进程可以使用。

multiprocessing模块的提供的函数需要子进程可以导入__main__模块









参考文档:

https://docs.Python.org/2/library/multiprocessing.html


--结束END--

本文标题: Python的multiprocessi

本文链接: https://lsjlt.com/news/182880.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python的multiprocessi
    1.基本介绍multiprocessing模块可以衍生出子进程。multiprocessing模块同时提供本地和远程的并发操作。multiprocessing模块不像threading模块那样会受到GIL全局解释器锁的限制,它使用进程代替线...
    99+
    2023-01-31
    Python multiprocessi
  • python multiprocessi
    import multiprocessingimport time,datetimedef Ssh_Cmd(host,CmdFile):        elog = open('error.log','a+')        log = o...
    99+
    2023-01-31
    python multiprocessi
  • 【Python】Python-pool的
    收集了几个python种进程池pool的使用例子,改写为py3版本。1. pool.apply_async进程非阻塞执行,输入不确定情况下用默认情况下,Pool会创建固定数目的工作进程,并向这些工作进程传递作业,直到再没有更多作业为止。当...
    99+
    2023-01-31
    Python pool
  • 【Python】Ceph的python接
    参考文章 ceph的python_api文档 连接ceph集群 import rados cluster = rados.Rados(conffile='/etc/ceph/ceph.conf') cluster.conn...
    99+
    2023-01-31
    Python Ceph python
  • [Python ] python中文件的
    原文地址: http://blog.163.com/qimeizhen8808@126/ 这女孩写的挺好,有值得学习的地方。   1) 文件的打开和创建,关闭  a)文件的打开和创建 主要有两个open()和file()两个方法。它们的功能...
    99+
    2023-01-31
    文件 Python python
  • 学习python的第四天(python的
    一.Jupyter的安装以及运行 1.Jupyter的安装 运行CMD,在CMD中输入pip3 --default-timeout=100 install -U jupyter 再输入pip3 install jupyter_contr...
    99+
    2023-01-31
    第四天 python
  • python的文件类型、python的变
    python的文件类型 1、源码文件:用.py结尾,有python解释器,不需要编译2、字节码文件:python 源码文件经编译后生成的扩展名为 .pyc 的二进制文件源码文件[root@centos7-3 python]# cat 1.p...
    99+
    2023-01-31
    文件类型 python
  • Python - 利用python编写的
    memcached作为缓存文件服务,默认是操作系统里面是可以直接yum -y install memcached进行安装的。/etc/init.d/memcached 是属于系统shell编写的管理脚本,下面这个脚本是python脚本编写出...
    99+
    2023-01-31
    Python python
  • 【Python】python之π的计算
    用IPO模式分析问题如下: 1.输入:抛点的数量。 2.处理:对于每个抛洒点,计算点到圆心的距 离,通过距离盘点该点在 圆内或圆外,统计在圆内点的数量。 3.输出:π值 代码如下 from random import ra...
    99+
    2023-01-31
    Python python
  • Python - 关于Python的变量
    Python的变量是动态的,不需要预先申明,当赋值时自动创建变量,并且Python变量存储的是对象的引用(非变量本身)。Python变量的命名规则与C语言相似,并且在日常使用中一般会遵循以下一些规则:A. 一般不以单下划线“_”开头,因为以...
    99+
    2023-01-31
    变量 Python
  • 【python】python代码的缩进
    未添加着色功能,这个比较麻烦,比如变量是什么色,函数是什么色,需要使用正则。使用blog里自带的python代码着色,更改如下:print('<pre class="brush:python;toolbar:false">' +...
    99+
    2023-01-31
    代码 python
  • python的settimeout
    有时候写python关于网络的程序。比如用urllib2等module发http请求的时候,发现有时候会有死掉的情况,就是程序没任何反应,也不是cpu,内存没资源的问题。具体情况还没搞明白那里出的问题,但是找到一个解决办法。就是设置sock...
    99+
    2023-01-31
    python settimeout
  • python的Scrapy...
    1、Scrapy Engine(Scrapy引擎)Scrapy引擎是用来控制整个系统的数据处理流程,并进行事务处理的触发。更多的详细内容可以看下面的数据处理流程。2、Scheduler(调度)调度程序从Scrapy引擎接受请求并排序列入队列...
    99+
    2023-01-31
    python Scrapy
  • Python ConfigParser的
    1.基本的读取配置文件-read(filename) 直接读取ini文件内容-sections() 得到所有的section,并以列表的形式返回-options(section) 得到该section的所有option-items(sect...
    99+
    2023-01-31
    Python ConfigParser
  • python的 ConfigParser
    ConfigParser模块是python自带的读取配置文件的模块.通过他可以方便的读取配置文件. 这篇文章简单介绍一下读取配置文件的方法. 配置文件.顾名思议就是存放配置的文件.下面是个例子 [info] age = 21 name = ...
    99+
    2023-01-31
    python ConfigParser
  • python的PYTHONPATH
    python的PATH包括: * 当前目录 * 环境变量PYTHONPATH * WINDOWS的注册表 * python安装目录下的lib和lib/site-packages *...
    99+
    2023-01-31
    python PYTHONPATH
  • python(一):Python中的主函数
    Python中的主函数 1、概述2、主函数2.1、Python文件作为脚本运行2.2、将Python文件作为模块运行 3、总结 1、概述 大家好,我是欧阳方超。今天说一下Python中...
    99+
    2023-09-22
    python 开发语言 数学建模
  • 【Python】解析Python中的条件
    1.if语句 if语句有好几种格式,比如: if condition: statement 使用 if ... else ...: if condition: statement(1) else: state...
    99+
    2023-01-31
    条件 Python
  • 【Python】python获取线程的返
    threading模块默认没有获取线程返回值的方法。下面通过重写threading.Tread类来实现:from threading import Thread import random import time class MyThrea...
    99+
    2023-01-31
    线程 Python python
  • 【Python】Python简单的图片识
    具体想要实现上面的代码需要安装两个包和一个引擎 在安装之前需要先安装好Python,pip并配置好环境变量 1.第一个包: pytesseract pip install pytesseract 若是出现安装错误的情况,安装...
    99+
    2023-01-31
    简单 图片 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作