【Python 多进程】
"
一、模块介绍
multiprocess模快
仔细说来,multiprocess不是一个模块,而是python中的一个操作、管理进程的包,之所以叫multi是取自multiple的多功能的意思,这个包中几乎包含了和进程有关的所有子模块。multiprocess.Process模块
Process能够帮助我们创建子进程,以及对子进程的一些控制.
- 参数:def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
group=None:该参数未使用,值始终为None
target:指定要调用的函数,即子进程要执行的任务
args:指定被调用对象的位置参数,以元组的形式传入,必须有逗号,如:args=('a',);此参数在源码中定义的只接收元组,但由于tuple数据类型底层原理的原因,此参数是可以传入一切可迭代对象,如:列表、字典、字符串、生成器表达式等
kwargs:指定被调用对象关键字参数,以字典的形式传入,关键字作为键,参数作为值
name:指定子进程的名称,默认名称为:Process-1、Process-2、...
- 方法
obj.start():启动子进程,并调用run()方法
obj.run():启动子进程时自动被调用,正是它去调用target参数指定的函数,自定义类中必须实现此方法
obj.terminate():强制终止子进程,不会进行任何清理操作,事实上是让操作系统去终止子进程;而操作系统终止进程是有一个过程的,所以子进程不会立即被终止;使用此方法需谨慎以下两种情况:1. 如果子进程中创建了子子进程,强制终止子进程后,子子进程将变成僵尸进程. 2. 如果子进程保存了一个锁,强制终止后,内存将不会被释放,进而导致死锁
obj.is_alive():判断子进程是否存活,若存活返回True,否则False
obj.join(timeout=None):阻塞父进程,等待子进程终止后再继续执行父进程,timeout指定等待超时时间;此方法只能用于使用start方法启动的子进程,对run方法启动的子进程无效
属性
obj.daemon:默认值为False,如果设为True,子进程将成为守护进程,此属性必须写在start()的前面;守护进程无法创建子进程,且会随着父进程的终止而终止
obj.name:返回子进程的名称
obj.pid:返回子进程的pid
obj.exitcode:子进程在运行时为None,如果为-N,则表示被信号N结束了
obj.authkey:子进程的身份验证键,默认由os.urandom()随机成生成的32bytes;是为涉及网络连接的底层进程间通讯提供安全性,这类连接只有在具有相同身份验证键时才能成功
二、使用Process创建进程
- windows系统使用Process模块需注意
由于windows操作系统中没有fork(Linux操作系统中创建进程的机制),因此启动子进程时采用的是导入启动子进程的文件的方式来完成进程间的数据共享。而导入文件即等于执行文件,因此如果将process()直接写在文件中将会无限递归子进程而报错,所以必须把创建子进程的部分使用if __name__ == '__main__':判断保护起来,以防止递归.
1. 基本操作
-
# 创建单个子进程及对子进程简单的控制
-
-
from multiprocessing import Process
-
from time import sleep
-
import os
-
-
-
def func(par):
-
print("%s, PID: %s" %(par, os.getpid()))
-
print("子进程终止后才继续执行父进程")
-
sleep(5)
-
-
-
if __name__ == '__main__':
-
-
p = Process(target=func, args=("子进程",)) # 实例化一个子进程对象p
-
# p.run() # run方法启动的子进程免疫join方法
-
p.start() # 子进程进入就绪状态,等待操作系统调度
-
-
print(p.is_alive()) # True: 子进程存活
-
p.join(1) # 阻塞父进程,等待子进程终止,等待超时时间1s
-
print(p.is_alive()) # False: 子进程终止
-
-
print("父进程, PID: %s" % os.getpid())
-
# 创建多个子进程
-
-
from multiprocessing import Process
-
from time import sleep
-
-
-
def func(n):
-
print("子进程", n)
-
sleep(0.1)
-
-
-
if __name__ == '__main__':
-
p_lst = []
-
for i in range(5): # 通过for循环启动多个子进程
-
p = Process(target=func, args=(i,))
-
p.start()
-
p_lst.append(p)
-
[p.join() for p in p_lst] # 阻塞父进程,等待所有子进程终止
-
-
print("父进程")
2. 自定义多进程类
-
# 自定义多进程类
-
-
from multiprocessing import Process
-
from time import sleep
-
-
-
class MyProcess(Process):
-
-
def __init__(self, target, name, sex):
-
self.sex = sex
-
super(MyProcess, self).__init__(target=target, name=name)
-
# self.name = name
-
# 父类Process初始化时会自动定义name属性,所以定义本类的name属性要写到super语句后面,
-
# 否则会被父类初始化时覆盖掉(MyProcess-子进程序号),或者给父类传参__init__(name=name)
-
-
def run(self): # 必写方法,用于调用函数
-
print("子进程:", self.name)
-
super(MyProcess, self).run()
-
-
-
func = lambda :print("执行了函数")
-
-
# 如果是Windows系统,此处要写一条__main__判断语句
-
p = MyProcess(func, 'zyk', 'boy')
-
p.start()
-
# p.run() # start方法会自动调用此方法
3.进程之间的数据共享与隔离
-
# 进程之间的数据共享与隔离
-
-
from multiprocessing import Process, Value
-
-
-
def func():
-
global n # !
-
n = 2 # 数据隔离:不会影响父进程中的变量n
-
print("子进程n: ", n) # 2
-
-
s.value = 4 # 数据共享:会影响父进程中的s
-
print("子进程s: ", s.value)
-
-
-
if __name__ == '__main__':
-
n = 1
-
s = Value('i', 3)
-
-
p = Process(target=func)
-
p.start()
-
p.join()
-
-
print("父进程n: ", n) # 1
-
print("父进程s: ", s.value) # 4
4.守护进程
-
# 守护进程
-
-
from multiprocessing import Process
-
from os import getpid
-
-
-
class MyProcess(Process):
-
-
def __init__(self, name):
-
super(MyProcess, self).__init__()
-
self.name = name
-
-
def run(self):
-
print(self.name, getpid())
-
# 父进程是先进入就绪状态的,所以父进程一般会先终止(除非父进程还有很长的逻辑要走)
-
# 子进程可能还未打印信息便随父进程终止而终止了,
-
-
p = MyProcess('zyk')
-
p.daemon = True # 确认为守护进程,随父进程终止而终止
-
p.start()
-
# p.join() # 阻塞父进程,方可正常执行完子进程,而显示打印信息
-
-
print("父进程")
5.进阶:socket消息加并发实例
-
# Server
-
-
from multiprocessing import Process
-
from socket import *
-
-
-
server = socket(AF_INET, SOCK_STREAM)
-
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
-
server.bind(('127.0.0.1', 8080))
-
server.listen(5)
-
-
-
def talk(conn, client_addr):
-
while True:
-
try:
-
msg = conn.recv(1472)
-
if not msg:break
-
conn.send(msg.upper())
-
except Exception:
-
break
-
-
-
if __name__ == '__main__':
-
while 1:
-
conn, client_addr = server.accept()
-
p = Process(target=talk, args=(conn, client_addr))
-
p.start()
-
print(p.name)
-
# Client
-
-
import socket
-
-
-
client = socket.socket()
-
client.connect_ex(('127.0.0.1', 8080))
-
-
-
while 1:
-
msg = input('>>>').strip()
-
if not msg:continue
-
-
client.send(msg.encode('utf-8'))
-
msg = client.recv(1472)
-
print(msg.decode('utf-8'))
完结
"
【Python 多进程】的更多相关文章
- Python多进程编程
转自:Python多进程编程 阅读目录 1. Process 2. Lock 3. Semaphore 4. Event 5. Queue 6. Pipe 7. Pool 序. multiproces ...
- Python多进程(1)——subprocess与Popen()
Python多进程方面涉及的模块主要包括: subprocess:可以在当前程序中执行其他程序或命令: mmap:提供一种基于内存的进程间通信机制: multiprocessing:提供支持多处理器技 ...
- Python多进程使用
[Python之旅]第六篇(六):Python多进程使用 香飘叶子 2016-05-10 10:57:50 浏览190 评论0 python 多进程 多进程通信 摘要: 关于进程与线程的对比, ...
- python多进程断点续传分片下载器
python多进程断点续传分片下载器 标签:python 下载器 多进程 因为爬虫要用到下载器,但是直接用urllib下载很慢,所以找了很久终于找到一个让我欣喜的下载器.他能够断点续传分片下载,极大提 ...
- Python多进程multiprocessing使用示例
mutilprocess简介 像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核CPU的利用率会比threading好的多. import multipr ...
- Python多进程并发(multiprocessing)用法实例详解
http://www.jb51.net/article/67116.htm 本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Pyt ...
- python 多进程开发与多线程开发
转自: http://tchuairen.blog.51cto.com/3848118/1720965 博文作者参考的博文: 博文1 博文2 我们先来了解什么是进程? 程序并不能单独运行,只有将程 ...
- Python多进程----从入门到放弃
Python多进程 (所有只写如何起多进程跑数据,多进程数据汇总处理不提的都是耍流氓,恩,就这么任性) (1)进程间数据问题,因为多进程是完全copy出的子进程,具有独立的单元,数据存储就是问题了 ( ...
- day-4 python多进程编程知识点汇总
1. python多进程简介 由于Python设计的限制(我说的是咱们常用的CPython).最多只能用满1个CPU核心.Python提供了非常好用的多进程包multiprocessing,他提供了一 ...
- python 多进程 logging:ConcurrentLogHandler
python 多进程 logging:ConcurrentLogHandler python的logging模块RotatingFileHandler仅仅是线程安全的,如果多进程多线程使用,推荐 Co ...
随机推荐
- H5Plus 入门学习-Dcloud H5+ API调用实例
使用API Reference完整简单的操作,更多操作查看官方文档. 最后提供项目的下载地址[下载][一款移动APP演示]
- SSH后台分页
初学SSH,开始用的Struts2+Hibernate3+Spring3,Hibernate中用的HibernateTemplate进行数据库的操作.之后在进行前台页面显示的时候,要用到分页,查了一下 ...
- elementui el-table根据分页显示表格序号
每页显示的序号都是一样的: <el-table :data="tableData" highlight-current-row @current-change="h ...
- Java连载77-Integer常用方法、Integer、int、String三者相互转化、自动装箱、自动拆箱
一.关于Integer中常用的方法 package com.bjpowernode.java_learning; public class D77_1_ { public static void ...
- js面向对象的程序设计 --- 中篇(创建对象) 之 原型模式
·原型模式 我们创建的每一个函数都由一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有 实例共享的属性和方法. 如果按照字面意思来理解,那 ...
- Maven设置阿里云镜像
<mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> & ...
- 大数据-es(elasticsearch)
elasticsearch elasticsearch是lucene作为核心的实时分布式检索,底层使用倒排索引实现. 倒排索引原理 索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址.由于不 ...
- 【算法学习记录-排序题】【PAT A1062】Talent and Virtue
About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about ...
- 第四十二篇 入门机器学习——Numpy的基本操作——索引相关
No.1. 使用np.argmin和np.argmax来获取向量元素中最小值和最大值的索引 No.2. 使用np.random.shuffle将向量中的元素顺序打乱,操作后,原向量发生改变:使用np. ...
- mybatis(六):设计模式 - 工厂方法模式