python函数关系图 python绘制关系图( 七 )


语法:Process([group [, target [, name [, args [, kwargs]]]]])
由该类实例化得到的对象,表示一个子进程中的任务(尚未启动) 。
注意:1. 必须使用关键字方式来指定参数;2. args指定的为传给target函数的位置参数,是一个元祖形式,必须有逗号 。
参数介绍:
group:参数未使用,默认值为None 。
target:表示调用对象,即子进程要执行的任务 。
args:表示调用的位置参数元祖 。
kwargs:表示调用对象的字典 。如kwargs = {'name':Jack, 'age':18} 。
name:子进程名称 。
代码:
除了上面这些开启进程的方法之外,还有一种以继承Process的方式开启进程的方式:
通过上面的研究,我们千方百计实现了程序的异步 , 让多个任务可以同时在几个进程中并发处理,他们之间的运行没有顺序 , 一旦开启也不受我们控制 。尽管并发编程让我们能更加充分的利用IO资源,但是也给我们带来了新的问题 。
当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题,我们可以考虑加锁,我们以模拟抢票为例 , 来看看数据安全的重要性 。
加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改 。加锁牺牲了速度,但是却保证了数据的安全 。
因此我们最好找寻一种解决方案能够兼顾:1、效率高(多个进程共享一块内存的数据)2、帮我们处理好锁问题 。
mutiprocessing模块为我们提供的基于消息的IPC通信机制:队列和管道 。队列和管道都是将数据存放于内存中 队列又是基于(管道+锁)实现的,可以让我们从复杂的锁问题中解脱出来,我们应该尽量避免使用共享数据,尽可能使用消息传递和队列 , 避免处理复杂的同步和锁问题,而且在进程数目增多时,往往可以获得更好的可获展性(后续扩展该内容) 。
线程
Python的threading模块
Python 供了几个用于多线程编程的模块,包括 thread, threading 和 Queue 等 。thread 和 threading 模块允许程序员创建和管理线程 。thread 模块 供了基本的线程和锁的支持,而 threading 供了更高级别 , 功能更强的线程管理的功能 。Queue 模块允许用户创建一个可以用于多个线程之间 共享数据的队列数据结构 。
python创建和执行线程
创建线程代码
1. 创建方法一:
2. 创建方法二:
进程和线程都是实现多任务的一种方式 , 例如:在同一台计算机上能同时运行多个QQ(进程),一个QQ可以打开多个聊天窗口(线程) 。资源共享:进程不能共享资源,而线程共享所在进程的地址空间和其他资源,同时,线程有自己的栈和栈指针 。所以在一个进程内的所有线程共享全局变量 , 但多线程对全局变量的更改会导致变量值得混乱 。
代码演示:
得到的结果是:
首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念 。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码 。同样一段代码可以通过CPython,PyPy , Psyco等不同的Python执行环境来执行(其中的JPython就没有GIL) 。
那么CPython实现中的GIL又是什么呢?GIL全称Global Interpreter Lock为了避免误导,我们还是来看一下官方给出的解释:
主要意思为:
因此 , 解释器实际上被一个全局解释器锁保护着 , 它确保任何时候都只有一个Python线程执行 。在多线程环境中,Python 虚拟机按以下方式执行:
由于GIL的存在 , Python的多线程不能称之为严格的多线程 。因为多线程下每个线程在执行的过程中都需要先获取GIL,保证同一时刻只有一个线程在运行 。

推荐阅读