若是学过linux下的进程,线程,信号...会有更加深刻的了解。所以推荐去学习下,包括网络编程都可以去了解,尤其是对select,poll,epoll都会有更多的认识。
进程就是资源管理的最小单位,而线程是程序执行的最小单位。一个程序可以有多个进程,一个进程可以有多个同时执行的线程
1.进程:
操作系统隔离各个进程可以访问的地址空间。如果进程间需要传递信息。那么可以使用进程间通信或者其他方式,像信号,像文件,数据库,剪切板....等。在进程的调度中,进程进行切换所需要的事件是比较多的。为了更好的支持信息共享和减少切换开销。从而从进程中演变出来了线程。
2.线程:
线程是进程的执行单元。对于大多数程序来说可能只有一个主线程,就是该程序进程。在系统中看起来所有的线程都是同时执行的,实际上是去共同抢占资源,当一个线程使用完后,下一个马上使用,减少了时间的空隙。和进程抢占时间片大致相同。但是依旧提高了很多的效率。
实例:下载文件时,可以将文件分成多个部分,然后使用多个线程同时去下载,从而加快下载速度。
3.进程线程的对比:
明确进程和线程的区别十分重要。
一般地,进程是重量级的。在进程中需要处理的问题包括进程间通信,临界区管理,和进程调度等。这些特性使得新生成一个进程的开销比较大。
线程是轻量级的。线程之间共享许多资源,容易进行通信,生成一个线程的开销比较小。但是在使用线程会遇到锁问题,死锁和自锁,还有数据同步,实现复杂等问题。需要谨慎使用。
GIL(全局解释器锁)和队列的使用减少了线程实现的复杂性,但是由于GIL的存在,所以python解释器不是线程安全的。因为使用当前线程必须持有这个全局解释器锁,从而可以安全的访问python数据。
例:需要计算操作时,要用到CPU进行处理数据,当我们调用多线程时,由于GIL的存在,一次只允许一个线程被CPU调度(哪怕我们有多核CPU)<为了保证数据同步>,所以由于GIL限制,无论我们开了多少线程,只能使用一个CPU,而CPU是专门用于计算的,所以对于计算型,使用多线程的效果反而下降了。所以计算密集型使用多进程,IO密集型使用多线程
(1)与进程和线程相关的模块 os/sys 包含基本进程管理函数 subprocess 多进程相关模块 signal 信号相关模块 threading 线程相关模块
(2)os/sys模块中与进程相关的函数 popen 生成新的进程 system 直接生成字符串所代表的进程 abort/exit 终止进程 exec足 在现有进程环境下生成新进程
进程编程
创建进程:
一:简单使用:
1.system函数
可以使用os模块中system函数创建进程,是最快捷方式,可以去执行命令或者调用其他程序
>>> import os >>> os.system("dir") 2018/04/21 周六 下午 07:09 <DIR> . 2018/04/21 周六 下午 07:09 <DIR> .. 2017/11/18 周六 下午 10:08 <DIR> .android 0 #执行命令dir,返回0,代表执行成功。否则失败 >>> os.system("calc") 0 #调用其他程序,计算器。 上面调用system产生的子进程的父进程都是该程序,只有子进程执行完毕,父进程才会获取控制器