python网络编程之开启进程的方式
标签(空格分隔): 开启进程的方式
multiprocessing模块介绍:
python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。
Python提供了multiprocessing。 multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,>提供了Process、Queue、Pipe、Lock等组件。
需要再次强调的一点是:与线程不同,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内。
Process类的介绍
创建进程的类:
Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,可用来开启一个子进程
强调:
- 需要使用关键字的方式来指定参数
- args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号
参数介绍:
group参数未使用,值始终为None
target表示调用对象,即子进程要执行的任务
args表示调用对象的位置参数元组,args=(1,2,'egon',)
kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}
name为子进程的名称
属性介绍:
p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置
p.name:进程的名称
p.pid:进程的pid
例如:如下代码开启进程的方式一:
from multiprocessing import Process
import time
def task(name):
print('%s is running ' %name)
time.sleep(3)
print('%s is done ' %name)
if __name__ == '__main__':
p=Process(targe=task,args=('子进程1'))
p.start()#仅仅是给子系统发送了一个信号
print('主')
执行结果:
主
子程序 is running
子程序 is done
大家可以看到执行程序的结果为:先打印“主”,然后创建子程序;
# 方式二:
class MyProcess(Process):
def __init__(self,name):
super(MyProcess, self).__init__()
self.name=name
def run(self):
print('%s is running ' %self.name)
time.sleep(3)
print('%s is done ' %self.name)
if __name__ == '__main__':
p=MyProcess('子进程1')
p.start()
print('主')
执行结果:
主
子进程1 is running
子进程1 is done
如上图是开启子进程的两种方式,结果一样,只是实现的方式不一样;
方法介绍:
p.start():启动进程,并调用该子进程中的p.run()
p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
p.is_alive():如果p仍然运行,返回True
p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间。
查看进程的pid与ppid
大家知道我们在管理人的时候,通过大家的身份证来识别,那么操作系统呢,操作系统在识别各种进程的时候,怎么区分呢?
同理:
操作系统管理进程也是一样:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from multiprocessing import Process
import time,os
def task():
print('%s is running' %os.getpid())
time.sleep(3)
print('%s is done' %os.getpid())
if __name__ == '__main__':
p=Process(target=task,)
p.start()
print('主 %s' %os.getpid())
执行结果:
主 3254
3255 is running
3255 is done
查看父进程:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from multiprocessing import Process
import time,os
def task():
print('%s is running' %os.getpid(),os.getppid())
time.sleep(3)
print('%s is done' %os.getpid(),os.getppid())
if __name__ == '__main__':
p=Process(target=task,)
p.start()
print('主 %s' %os.getpid(),os.getppid())
执行结果为:
('\xe4\xb8\xbb 3482', 2583)
('3483 is running', 3482)
('3483 is done', 3482)
上述结果可以查看,2583是这个主进程的父进程,那就应该是pycharm运行这个程序的进程,大家可以自己查看一下pycharm的进程id就可以知道了;
![image.png-180.1kB][1]
如图可以看到上述的2583是pycharm进程;
僵尸进程和孤儿进程:
('\xe4\xb8\xbb 3482', 2583)
('3483 is running', 3482)
('3483 is done', 3482)
上述的第一行,是父进程结束了,大家可以看到父进结束了,父进程在等着子进程运行,那么为什么父进程运行完了还要等着子进程呢?
父亲生了10个儿子,儿子干什么工作就和自己没关系了,但是父亲可以去看看儿子;
所以说要实现一种逻辑就是:父进程什么时候去看他的儿子都可以看到,即使儿子已经死掉了,也要保留一个躯体,--这就是僵尸进程,
僵尸进程,是Linux为我们提供的一种状态,虽然内存空间清理了,但是状态在,就是为了父亲看的时候方便,父亲可为他收尸;父亲可以回收;
所有的子进程都要经力僵尸进程;
僵尸进程有害吗?
有害:进程还有pid,僵尸多了,pid会被占用,一堆僵尸进程,导致机器开不了进程;
孤儿进程:
没有父进程,就是孤儿进程,儿子没死,爹死了就是孤儿进程;
孤儿进程,无害,
[1]: http://static.zybuluo.com/wangcherry123/0ilnmwl0e56zasuy179osz92/image.png
python网络编程之开启进程的方式的更多相关文章
- [Python网络编程]浅析守护进程后台任务的设计与实现
在做基于B/S应用中.常常有须要后台执行任务的需求,最简单比方发送邮件.在一些如防火墙,WAF等项目中,前台仅仅是为了展示内容与各种參数配置.后台守护进程才是重头戏.所以在防火墙配置页面中可能会常常看 ...
- python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)
python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...
- Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量
Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量 一丶线程的理论知识 什么是线程: 1.线程是一堆指令,是操作系统调度 ...
- Python 网络编程(二)
Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...
- python 网络编程 IO多路复用之epoll
python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解 此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...
- python网络编程——IO多路复用之select
1 IO多路复用的概念 原生socket客户端在与服务端建立连接时,即服务端调用accept方法时是阻塞的,同时服务端和客户端在收发数据(调用recv.send.sendall)时也是阻塞的.原生so ...
- 图解Python网络编程
返回目录 本篇索引 (1)基本原理 (2)socket模块 (3)select模块 (4)asyncore模块 (5)asynchat模块 (6)socketserver模块 (1)基本原理 本篇指的 ...
- Python 网络编程(一)
Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...
- Python学习(22)python网络编程
Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...
随机推荐
- JAVA项目常用异常处理情况
Java异常处理 网络整理 这里是异常的说明: 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastExce ...
- nginx配置开机启动及配置sudo授权启动
1.https://www.cnblogs.com/whatmiss/p/7091220.html 配置开机启动nginx 2.sudo授权其它用户启动 (1)root用户编辑 visu ...
- 4. mysql 查看数据库中所有表的记录数
use information_schema; select table_name,table_rows from tables where TABLE_SCHEMA = 'testdb' orde ...
- filter map reduce函数的使用
#filter("处理逻辑","可迭代对象") 把可迭代对象依次处理逻辑处理,如果值为真就返回值,值为假就不返回; li = ['testA','yerA',' ...
- VC中编译报错:error C2011: 'fd_set' : 'struct' type redefinition
这是头文件包含顺序的问题,原因与解决办法见下面代码的注释. /* 包含下面这两个头文件时,必须把winsock2.h放在前面 否则编译报错,N多的重定义错误:例如 error C2011: 'fd_s ...
- Vim 常用命令和编辑方法
命令模式 :e <path/to/file> → 打开一个文件 :w → 存盘 :wq → 存盘 + 退出 (:w 存盘, :q 退出) (陈皓注::w 后可以跟文件名) :savea ...
- How to install Redis 3.2 on CentOS 6 and 7
What is Redis? Redis is a flexible open-source, key value data store, used as a database, cache and ...
- subsets 回溯 给定集合,枚举子集。元素不重复
这个回溯感觉掌握的有些熟练了. 两种方式,递归和循环. 感觉就是套框架了. /** * Return an array of arrays of size *returnSize. * The siz ...
- COBOL和C#比较
<予備>
- Spring Cloud限流详解
转自:https://blog.csdn.net/tracy38/article/details/78685707 在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud ...