标签(空格分隔): 开启进程的方式


multiprocessing模块介绍:

python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。

Python提供了multiprocessing。 multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,>提供了Process、Queue、Pipe、Lock等组件。

需要再次强调的一点是:与线程不同,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内。

Process类的介绍

创建进程的类:

Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,可用来开启一个子进程

强调:

  1. 需要使用关键字的方式来指定参数
  2. 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网络编程之开启进程的方式的更多相关文章

  1. [Python网络编程]浅析守护进程后台任务的设计与实现

    在做基于B/S应用中.常常有须要后台执行任务的需求,最简单比方发送邮件.在一些如防火墙,WAF等项目中,前台仅仅是为了展示内容与各种參数配置.后台守护进程才是重头戏.所以在防火墙配置页面中可能会常常看 ...

  2. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...

  3. Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量

    Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量 一丶线程的理论知识 什么是线程:    1.线程是一堆指令,是操作系统调度 ...

  4. Python 网络编程(二)

    Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...

  5. python 网络编程 IO多路复用之epoll

    python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解     此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...

  6. python网络编程——IO多路复用之select

    1 IO多路复用的概念 原生socket客户端在与服务端建立连接时,即服务端调用accept方法时是阻塞的,同时服务端和客户端在收发数据(调用recv.send.sendall)时也是阻塞的.原生so ...

  7. 图解Python网络编程

    返回目录 本篇索引 (1)基本原理 (2)socket模块 (3)select模块 (4)asyncore模块 (5)asynchat模块 (6)socketserver模块 (1)基本原理 本篇指的 ...

  8. Python 网络编程(一)

    Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...

  9. Python学习(22)python网络编程

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

随机推荐

  1. C#分解质因数

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace app ...

  2. 使用Java让android手机自动执行重复重启

    public static void main(String[] args)throws IOException,Exception { for(int j=0;j<10;j++) { Thre ...

  3. wmware虚拟机的克隆

    VMware 支持两种类型的克隆:完整克隆 链接克隆 完整克隆是和原始虚拟机完全独立的一个拷贝,它不和原始虚拟机共享任何资源.可以脱离原始虚拟机独立使用. 链接克隆需要和原始虚拟机共享同一虚拟磁盘文件 ...

  4. python中的popitem

    popitem()随机删除字典中的任意键值对,并返回到元组中 1 a = { 2 "name":"dlrb", 3 "age":25, 4 ...

  5. Cannot run Eclipse; JVM terminated. Exit code=13

    在myeclipse 上运行好好的, 在 eclipse 上就运行不了了. 运行eclipse.exe 就出现: Cannot run Eclipse; JVM terminated. Exit co ...

  6. python3自动生成并运行bat批处理,并重定向输入消除黑窗口

    #coding:utf-8import os #bat文件的内容(temp.bat)bat_name='temp.bat's1='''echo offipconfigecho Hello world! ...

  7. 深度学习原理与框架-神经网络结构与原理 1.得分函数 2.SVM损失函数 3.正则化惩罚项 4.softmax交叉熵损失函数 5. 最优化问题(前向传播) 6.batch_size(批量更新权重参数) 7.反向传播

    神经网络由各个部分组成 1.得分函数:在进行输出时,对于每一个类别都会输入一个得分值,使用这些得分值可以用来构造出每一个类别的概率值,也可以使用softmax构造类别的概率值,从而构造出loss值, ...

  8. C# 方法参数传递方式 关键字(in、out、ref)

    in:  值传递,默认传递方式: ref:地址/引用传递,调用时该参数必需已经初始化: out:地址/引用传递,调用时该参数不需要先初始化(被调用方负责该参数的初始化). 注1: in  关键字用于向 ...

  9. mysqldump备份时保持数据一致性

    对MySQL数据进行备份,常见的方式如以下三种,可能有很多人对备份时数据一致性并不清楚 1.直接拷贝整个数据目录下的所有文件到新的机器.优点是简单.快速,只需要拷贝:缺点也很明显,在整个备份过程中新机 ...

  10. Python开发环境搭建指导

    本文主要介绍Python开发环境的搭建.主要包括如下几部分内容: (1)Python软件的安装.注意版本的选择和安装过程中选项的勾选. (2)pip工具环境变量.镜像源的配置使用和常用镜像源介绍.pi ...