python multiprocessing模块

原文地址

multiprocessing

multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。
创建进程的类:Process([group[, target[, name[, args[, kwargs]]]]])
target表示调用对象
args表示调用对象的位置参数元组。
kwargs表示调用对象的字典。name为别名。
group表示线程组。方法:
is_alive():返回进程是否
join([timeout])运行:阻塞当前上下文环境的进程,直到调用此方法的进程终止或到达指定timeout(可选参数)
run():start()调用run方法,如果实例进程时未制定target,这start执行 默认run()方法
start():进程准备就绪,等待CPU调度
terminate():不管任务是否完成,立即停止工作进程
其中,Process以start()启动某个进程。属性:authkey、daemon(要通过start()
设置)、exitcode(进程在运行时为None、如果为–N,表示被信号N结束)、name、pid。其中daemon是父进程终止后自动终止,且自己不能产生新进程,必须在start()
之前设置。

  

Process类

构造方法:Process([group [, target [, name [, args [, kwargs]]]]])group: 线程组,目前还没有实现,库引用中提示必须是None; target: 要执行的方法; name: 进程名; args/kwargs: 要传入方法的参数。实例方法:is_alive():返回进程是否在运行。join([timeout]):阻塞当前上下文环境的进程程,直到调用此方法的进程终止或到达指定的timeout(可选参数)。start():进程准备就绪,等待CPU调度run():strat()调用run方法,如果实例进程时未制定传入target,这star执行t默认run()方法。terminate():不管任务是否完成,立即停止工作进程属性:daemon:和线程的setDeamon功能一样name:进程名字。pid:进程号。

  

进程的调用

关于创建多线程

四种方法可以创建多线程
(1)系统初始化:启动操作系统时开启的线程,比如前后台进程。
(2)执行了正在运行的进程所调用的进程创建系统进程:一个正在运行的进程经常发出系统调用,以便创建一个或多个新进程协助其工作。
(3)用户请求创建一个新进程:双击图标,打开一个新程序,又比如运行我们编写的程序等。
(4)一个批处理作业的初始化:这种只有在大型机的批处理系统中应用,在这里不提及。
注意:所有情形中,新进程都是由一个已存在的进程执行一个用于创建进程的系统调用而创建的,这个进程所做的工作是,执行一个用来创建新进程的系统调用,系统调用会通知操作系统创建一个新进程,并且直接或间接地指定在该进程中运行的程序。UNIX:fork,这个系统调用会创建一个与调用进程相同的副本,父进程与子进程拥有相同的存储映像,通常,子进程接着执行execve或一个类似的系统调用,以修改其存储映像并运行一个新的程序。
Windows:Win32函数调用Create'Process创建进程,也负责进行父子进程的复制,该调用由10个参数。
UNIX、Windows中,进程创建之后,父子进程有各自不同的地址,如果其中某个进程在其地址空间进行修改(可写内存),这个修改对于其他进程而言是不可见的。(不共享内存)
UNIX,子进程的初始地址是父进程的副本,但这里涉及两个不同的地址看见,不可写的内存是共享的(某些UXIX的实现使程序正文在两者共享,因为它不能被修改),对于新创建的进程而言,有可能共享其创建者的其他资源,比如打开的文件等。
Windows中,从一开始父进程与子进程的地址空间就不一样。

#创建调用多进程
#函数
# import multiprocessing
# import time
#
# def worker_1(interval):
#     print("worker_1")
#     time.sleep(interval)
#     print("end worker_1")
#
# def worker_2(interval):
#     print("worker_2")
#     time.sleep(interval)
#     print("end worker_2")
#
#
# if __name__ == "__main__":
#     p1 = multiprocessing.Process(target = worker_1, args = (2,))
#     p2 = multiprocessing.Process(target = worker_2, args = (3,))
#     p1.start()
#     p2.start()
#     p1.join()
#     p2.join()
#     print('finsh end')#定义成类
# import multiprocessing
# import time
#
# class ClockProcess(multiprocessing.Process):
#     def __init__(self, interval):
#         multiprocessing.Process.__init__(self)
#         self.interval = interval
#
#     def run(self):
#         n = 5
#         while n > 0:
#             print("the time is {0}".format(time.ctime()))
#             time.sleep(self.interval)
#             n -= 1
#
# if __name__ == '__main__':
#     p = ClockProcess(3)
#     p.start()

进程同步

注意:这里使用锁需要把锁传递进函数,因为是使用的是不同的进程,这里有复制拷贝!!!

from multiprocessing import Process, Lockdef f(l, i):with l.acquire():print('hello world %s'%i)if __name__ == '__main__':lock = Lock()for num in range(10):Process(target=f, args=(lock, num)).start()

进程间通讯

进程对列Queue

from multiprocessing import Process, Queue
import queuedef f(q,n):#q.put([123, 456, 'hello'])q.put(n*n+1)print("son process",id(q))if __name__ == '__main__':q = Queue()  #try: q=queue.Queue()print("main process",id(q))for i in range(3):p = Process(target=f, args=(q,i))p.start()print(q.get())print(q.get())print(q.get())

  

管道

The Pipe() function returns a pair of connection objects connected by a pipe which by default is duplex (two-way). For example:

from multiprocessing import Process, Pipedef f(conn):conn.send([12, {"name":"yuan"}, 'hello'])response=conn.recv()print("response",response)conn.close()print("q_ID2:",id(child_conn))if __name__ == '__main__':parent_conn, child_conn = Pipe()print("q_ID1:",id(child_conn))p = Process(target=f, args=(child_conn,))p.start()print(parent_conn.recv())   # prints "[42, None, 'hello']"parent_conn.send("儿子你好!")p.join()

The two connection objects returned by Pipe() represent the two ends of the pipe. Each connection object has send() and recv() methods (among others). Note that data in a pipe may become corrupted if two processes (or threads) try to read from or write to the same end of the pipe at the same time. Of course there is no risk of corruption from processes using different ends of the pipe at the same time.

Managers

Queue和pipe只是实现了数据交互,并没实现数据共享,即一个进程去更改另一个进程的数据。

A manager object returned by Manager() controls a server process which holds Python objects and allows other processes to manipulate them using proxies.

A manager returned by Manager() will support types listdictNamespaceLockRLockSemaphoreBoundedSemaphoreConditionEventBarrierQueueValue and Array. For example:

from multiprocessing import Process, Managerdef f(d, l,n):d[n] = '1'd['2'] = 2d[0.25] = Nonel.append(n)#print(l)print("son process:",id(d),id(l))if __name__ == '__main__':with Manager() as manager:d = manager.dict()l = manager.list(range(5))print("main process:",id(d),id(l))p_list = []for i in range(10):p = Process(target=f, args=(d,l,i))p.start()p_list.append(p)for res in p_list:res.join()print(d)print(l)

进程池

进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。

进程池中有两个方法:

  • apply
  • apply_async
from  multiprocessing import Process,Pool
import time,osdef Foo(i):time.sleep(1)print(i)return i+100def Bar(arg):print(os.getpid())print(os.getppid())print('logger:',arg)pool = Pool(5)Bar(1)
print("----------------")for i in range(10):#pool.apply(func=Foo, args=(i,))#pool.apply_async(func=Foo, args=(i,))pool.apply_async(func=Foo, args=(i,),callback=Bar)pool.close()
pool.join()
print('end')

转载于:https://www.cnblogs.com/-wenli/p/10819978.html

python multiprocessing模块相关推荐

  1. python 多线程 模块_Python多线程threading和multiprocessing模块实例解析

    本文研究的主要是Python多线程threading和multiprocessing模块的相关内容,具体介绍如下. 线程是一个进程的实体,是由表示程序运行状态的寄存器(如程序计数器.栈指针)以及堆栈组 ...

  2. Python进程学习笔记-multiprocessing模块

    如果你打算编写多进程的服务程序,Unix/Linux无疑是正确的选择.由于Windows没有fork调用,难道在Windows上无法用Python编写多进程的程序? 由于Python是跨平台的,自然也 ...

  3. python如何关闭multiprocess_python 开启进程两种方法 multiprocessing模块 介绍

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

  4. python 多进程 调用模块内函数_进程创建fork()和multiprocessing模块Process类

    一.进程VS程序 一个人穿上军装去打仗就是战士,战士需要武器.战场等资源.一个人去种田就是农民,农民需要土地.锄头等资源. 编写完毕的代码,安静的呆在磁盘上,称之为程序.代码要运行就得加载到内存,正在 ...

  5. Python标准模块--multiprocessing

    1 模块简介 multiprocessing模块在Python2.6中引入.最初的multiprocessing是由Jesse Noller和Richard Oudkerk在PEP 371中定义.就像 ...

  6. Python 多进程并行编程实践: multiprocessing 模块

    转载:http://python.jobbole.com/87645/ 前言 并行计算是使用并行计算机来减少单个计算问题所需要的时间,我们可以通过利用编程语言显式的说明计算中的不同部分如何再不同的处理 ...

  7. python multiprocessing_Python的multiprocessing模块详解

    通过multiprocessing模块的Process类创建一个进程的实力,并通过run()的方法来运行他from multiprocessing import Process import os d ...

  8. 简单介绍python process模块

    在python中大部分情况需要使用多进程,python提供了multiprocessing模块.multiprocessing模块的功能众多:支持子进程.通信和共享数据.执行不同形式的同步,提供了Pr ...

  9. 进程初识和multiprocessing模块之Process

    一.什么是进程 进程就是运行中的程序进程是操作系统中最小的资源分配单位进程与进程之间的关系 : 数据隔离的进程的id:Process id = pid pid是一个全系统唯一的对某个进程的标识,随着这 ...

最新文章

  1. Android面试题目之(七) AsyncTask的原理是什么?
  2. 如何检查电脑是否安装了python-python-如何检查安装了scikit的nltk版本?
  3. 在ASP.NET MVC 模型中 选择最好的方法将多个model(数据模型)传递到视图
  4. Pycharm远程连接Linux服务器
  5. 电脑安装软件出现更改计算机怎么回事,win10电脑总是自动安装软件怎么办
  6. 数据备份、pymysql模块
  7. 算法:阶乘的五种算法
  8. .net 特性 Attribute
  9. 配置中心、消息队列、分布式服务链路跟踪
  10. oracle tovarchar2_Oracle 数据类型转换之 varchar2,number,date
  11. Unity3D之NGUI基础8:UI锚点与深度
  12. 版本控制、协同开发工具比较
  13. 帆软超级链接使用(根据内容跳转不同页面、超级链接使用js并传参、超级链接参数传递)
  14. 异步读写之利用完成历程
  15. 数学建模英文论文写作
  16. 苹果 M1 革了 Intel x86 的命?
  17. 普通人的第一个Linux发行版-安装Deepin20.5
  18. 使用Python对视频任意矩形区域进行裁剪
  19. 【导数术】14.凹凸反转
  20. 校园网连接后,浏览器打不开登录界面可能的一种解决方法

热门文章

  1. Android系统源码导入Android studio
  2. 提供推荐——协作型过滤
  3. 第十五周程序阅读-范型程序设计(1)
  4. HwBinder驱动篇-Android10.0 HwBinder通信原理(十)
  5. Android防止按钮连续点击
  6. Flutter开发之认识Flutter(一)
  7. iOS架构-cocoapods之公共库的发布与集成(16)
  8. oracle手动执行归档,Oracle手动归档模式的代码描述是怎样的呢?
  9. Windows7 Scrapy框架建立
  10. 某日是当前年的第几天