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


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. jquery IE中加载xml

    $.ajax({ url: 'xml/myXML.xml', dataType: ($.browser.msie) ? "text" : "xml", time ...

  2. Java课程作业之动手动脑(二)

    纯随机数发生器 编写一个方法,使用以下算法生成指定数目(比如1000个)的随机整数. import java.util.Scanner; public class test { public stat ...

  3. Hive 组内计无重复数,追加每条记录后面

    今天无意中碰到一个很简单的计算逻辑,但是用hive想了一大会才实现. 示例表数据: 需求逻辑: 给每条记录追加一个字段,用于统计按照p1和p2字段分组后,每个组中的num的数目(去重后的count). ...

  4. JavaScript数组的五个迭代方法的简单实例

    <script> //every() var nums = [1,2,3,4,5]; var result = nums.every(function eve(item,index,arr ...

  5. NDK samples以及部分博客

    谷歌的ndk samples Android NDK samples with Android Studio http://developer.android.com/ndk 引用C/C++文件请参考 ...

  6. Redis 内存溢出过期策略

    1: 设置内存最大值, 如果该主机只作为 redis 服务器, 无其它比较占用资源的服务, 建议设置为内存的 3/4 大小, 单位 B 2: 设置内存溢出解决策略, 推荐 1-5 任选一种, 不推荐 ...

  7. hasattr getattr setattr delattr --> (反射)

    class Room: def __init__(self,name): self.name = name def big_room(self): print('bigroot') R = Room( ...

  8. 【转】Intro to ShockBurst/Enhanced ShockBurst

    原地址https://devzone.nordicsemi.com/b/blog/posts/intro-to-shockburstenhanced-shockburst Wireless PC ac ...

  9. HTML学习-1网页基础知识

    HTML超文本标记语言:HyperText Markup Language. 由浏览器运行解析. 它包括了静态页面.html   .htm.动态页面.php .aspx .jsp,从数据库提取. 今天 ...

  10. as2 shareObject本地缓存存储位置:

    shareObject本地缓存存储位置: win7系统用户到C:\Users\[你的用户名]\AppData\Roaming\Macromedia\Flash Player\#SharedObject ...