forking 编程

forking编程
forking编程的基本思路
需要使用os模块
os.fork()函数实现forking
python中绝大数的函数只返回一次
对fork()调用,针对父进程返回进程的PID;对应子进程返回PID0
因为所有的父子进程拥有相同的资源,所以在编程时避免资源冲突


使用轮询解决zombie问题
父进程通过os.wait()来得到子进程是否终止的信息
在子进程终止和父进程调用wait()之间的这段时间,子进程被称为zombie进程
如果子进程还没终止,父进程先退出,那么子进程会持续工作。系统自动将子进程的父进程设置为init进程,init将来负责清理僵尸进程
python可以使用waitpid()来处理子进程
waitpid()接收两个参数,第一个参数设置为-1,表示与wait()函数相同;第二参数如果设置为0表示挂起父进程,直到子进程退出,设置1表示挂起父进程
waitpid()的返回值:如果子进程尚未结束则返回0,否则返回子进程PID

forking服务器
在网络服务器中,forking广泛使用
如果服务器需要同时响应多个客户端,那么forking是解决问题的最常用的方法之一
父进程负责接收客户端的连接请求
子进程负责处理客户端的请求

多线程工作原理
多线程的动机
在多进程MT编程出现之前,电脑程序的运行有一个执行序列组成,执行序列按顺序在主机的中央处理器中运行
无论是任务本身要求顺序执行还是整个程序由多个子任务组成,程序都是按这种方式执行
即使子任务相互独立,相互无关也这样
如果并行运行这些相互独立的子任务时可以大幅提高整个任务的效率

多线程任务的工作特点
他们本质上是异步的,需要多个并发事务
各个事务的运行顺序可以是不确定的,随机的,不可预测
这样的编程任务可以被分成多个执行流,每个流都有一个要完成的目标
根据应用的不同,这些任务都要计算出一个中间结果,用于合并得到最后的结果

什么是进程
计算机程序只不过是磁盘中可执行、二进制的数据
进程(有时被称为重量级进程)是程序的一次执行
每个进程都有自己的地址空间、内存以及其他记录运行轨迹的辅助数据
操作系统管理在其运行的所有进程,并为这些进程公平的分派时间

什么是线程
线程(有时被称为轻量级进程)跟进程有些像似。不同的是,所有的线程运行在同一个进程中,共享相同的运行环境
线程有开始、顺序执行和结束三部分
线程的运行可能被抢占(中断),或暂时的被挂起,让其他线程运行,这叫做让步。
一个进程中的各个线程之间共享同一片数据空间,所以线程之间可以比进程更方便的共享数据以及相互通讯
线程一般都是并发运行的,正式由于这种并行和数据共享的机制使得多个任务的合作变得可能
需要注意的是在单CPU的系统中,真正的并发是不可能的,每个线程会被安排每次执行一小会,然后就把CPU让出来,让其他线程取运行

多线程编程
多线程相关模块
thread和threading模块允许程序员创建和管理线程
thread模块提供了基本的线程和锁的支持,threading提供了更高级别、功能更强大的线程管理功能
推荐使用threading模块
只建议那些有经验的专家在相访问线程的底层结构的时候,才是用thread模块

传递函数给Thread类
多线程编程有多种方法,传递函数给threading模块的Thread类的是介绍的第一种方法
Thread对象使用start()方法开始线程的执行,使用join()方法挂起程序,直到线程结束

含有线程的服务器
多数线程服务器有相同的结构
主线程是负责侦听请求的线程
主线接收一个请求的时候,新的工作线程会被建立起来,处理客户端请求
客户端断开时,工作线程将中止
线程划分为用户线程和后台daemon进程,SetDaemon将进程设置为后台进程

posted @ 2018-02-08 18:33  Guan_zi  阅读(174)  评论(0编辑  收藏  举报