Python学习day35-并发编程(1)

 

Python学习day35-并发编程(1)

进程的基础

顾名思义,进程就是程序正在执行的一个过程.进程的概念最先是来源于操做系统,是操做系统最核心的概念,因此要真正了解进程,必须事先了解操做系统.html

http://www.javashuo.com/article/p-cpsqrfkp-c.htmlnode

简单来讲,由于早期的计算机只有一个cpu,也能支持并发(伪并行)的能力.或者是将一个单独的cpu变成多个虚拟的cpu(也就是多道技术:时间多路复用和空间多多路复用+硬件上支持隔离).python

什么是进程

官方的话来讲,进程(Process)就是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,也是操做系统结构的基础.linux

狭义来讲,进程是正在运行的程序的实例web

广义来讲,进程是一个具备必定独立功能的程序关于某个数据集合的一次运行活动.是操做系统动态执行的基本单元,在传统的操做系统中,进程便是基本的分配单元,又是基本的执行单元.shell

同一个程序执行两次,就会在操做系统中出现两个进程,这两个进程是互不干扰的,相互独立的,因此咱们能够同时运行一个软件,分别作不一样的事情,也不会混乱.编程

进程的并行和并发

  • 并发:并发是指资源有限的状况下,二者或者更多的使用者轮流使用资源,并发是一种伪并行,实际上并发同一时间仍是只能被一个使用者使用,只是能够交替使用,从而提升效率windows

  • 并行:并行是指二者同时执行,是真正的同时执行,不是并发那样看似像是同时进行,并行的最基础的条件就是多核,或者说是多个大脑,资源够用的状况下,才能够并行.服务器

    其区别:session

    并行是从微观上,也就是在一个精确的时间片刻,有不一样的程序在执行,就必须有多个处理器,来实现并行.

    并发是从宏观上看的,在一个时间段内能够看作是同时执行,好比一个服务器要同时处理多个session,其实是并发,而不是并行.

进程的建立和结束

进程的建立

实际上,新进程的建立都是由一个已经存在的进程执行了一个用于建立进程的系统调用而建立的.

  • Windows建立进程是调用的CreateProcess,这个指令负责处理进程的建立,同时也负责把正确的程序装入新进程里
  • 在UNIX系统中,系统调用是fork,fork会建立一个与父进程如出一辙的副本,两者有相同的存储印象,一样的环境字符串和一样的打开文件,实际上在shell解释器进程中,执行一个命令就会建立一个子进程.子进程和父进程是能够有只读的共享内存区的,可是对于Windows来讲,从一开始父进程和子进程的地址空间就是不一样的.

进程的结束

  1. 正常退出(自愿的,linux中用exit,Windows中用ExitProcess,或者各类界面化的关闭,关机等)
  2. 出错退出(自愿的,好比python中文件不存在)
  3. 严重错误(非自愿,执行非法指令,如引用不存在的内存,1/0等,能够经过捕捉异常来避免这种错误)
  4. 被其余进程杀死(非自愿,好比kill -9)

模块multiprocess

其实究其根原本说,multiprocess不是一个模块,而是python中一个操做,管理进程的包.其中的multi就是取自mulitiple的多功能的意思.

Process模块时一个建立进程的模块,借助这个模块咱们就能够完成进程的建立.

Process模块的简单使用

点开Process的源码,咱们能够看到如下内容

 
 
 
xxxxxxxxxx
1
25
 
 
 
 
1
class Process(object):
2
    def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
3
        self.name = ''
4
        self.daemon = False
5
        self.authkey = None
6
        self.exitcode = None
7
        self.ident = 0
8
        self.pid = 0
9
        self.sentinel = None
10
11
    def run(self):
12
        pass
13
14
    def start(self):
15
        pass
16
17
    def terminate(self):
18
        pass
19
20
    def join(self, timeout=None):
21
        pass
22
23
    def is_alive(self):
24
        return False
25
'''
26
其中的参数含义为:
27
1. group,默认为None,不用赋值
28
2. target为调用对象,能够是函数,或者类
29
3. args表示调用对象的位置参数元组,注意,必须是元组
30
4. kwargs为调用对象的字典,注意,必须是字典
31
5. name为子进程的名称,这个能够任意定义
32
33
属性的含义为:
34
1. p.daemon(),默认值为False,若是设置成True就表明p是后台运行的守护进程,p的父进程终止的时候p也要随之终止,且p不能建立本身的新进程
35
2. p.name(),就是子进程的名字
36
3. p.pid(),子进程的pid
37
4. p.exitcode(),没有大用,没必要理会
38
5. p.authkey(),暂时不用了解
39
40
其中的一些方法的含义为:
41
1. p.run(),进程启动时会自动运行的方法,没必要手动去调用,因此咱们能够在这个方法里写入想要实现或者赋值的一些语句
42
2. p.start(),启动进程,并自动调用子进程中的run(),须要手动调用
43
3. p.terminate(),强制终止进程,但不会进行清理操做,容易产生僵尸进程,要谨慎使用
44
4. p.join(),主线程等待p终止,注意,是主线程在等,p子进程仍是在运行的状态,括号里是能够写等待超时的时间,可是join只能等待用start开启的进程,用run开启的不能用
45
5. p.is_alive(),判断子进程p是否还在运行,若是在运行返回True,若是没有运行返回False
46
'''
 
 

很显然这是一个类,因此咱们能够经过对这个类实例化来产生对象.

须要注意的几点是:

  1. 咱们必须用关键字的方式来指定参数,好比Process(target = func,name = nick,args = (,))
  2. args是指定的为target所指的函数的位置参数,是一个元组的形式,至少要有一个逗号,就算只有一个值也要有一个逗号.
相关文章
相关标签/搜索