多线程,多进程
进程是资源分配的最小单位,线程是CPU调度的最小单位
什么是线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。一个线程是一个execution context(执行上下文),即一个cpu执行时所需要的一串指令。
进程
一个程序的执行实例就是一个进程。每一个进程提供执行程序所需的所有资源。(进程本质上是资源的集合)
进程与线程区别
1.同一个进程中的线程共享同一内存空间,但是进程之间是独立的。
2.同一个进程中的所有线程的数据是共享的(进程通讯),进程之间的数据是独立的。
3.对主线程的修改可能会影响其他线程的行为,但是父进程的修改(除了删除以外)不会影响其他子进程。
4.线程是一个上下文的执行指令,而进程则是与运算相关的一簇资源。
5.同一个进程的线程之间可以直接通信,但是进程之间的交流需要借助中间代理来实现。
6.创建新的线程很容易,但是创建新的进程需要对父进程做一次复制。
7.一个线程可以操作同一进程的其他线程,但是进程只能操作其子进程。
8.线程启动速度快,进程启动速度慢(但是两者运行速度没有可比性)。
http://www.cnblogs.com/whatisfantasy/p/6440585.html
1)需要频繁创建销毁的优先用线程
这种原则最常见的应用就是Web服务器了,来一个连接建立一个线程,断了就销毁线程,要是用进程,创建和销毁的代价是很难承受的
2)需要进行大量计算的优先使用线程
所谓大量计算,当然就是要耗费很多CPU,切换频繁了,这种情况下线程是最合适的。
这种原则最常见的是图像处理、算法处理。
3)强相关的处理用线程,弱相关的处理用进程
什么叫强相关、弱相关?理论上很难定义,给个简单的例子就明白了。
一般的Server需要完成如下任务:消息收发、消息处理。“消息收发”和“消息处理”就是弱相关的任务,而“消息处理”里面可能又分为“消息解码”、“业务处理”,这两个任务相对来说相关性就要强多了。因此“消息收发”和“消息处理”可以分进程设计,“消息解码”、“业务处理”可以分线程设计。
当然这种划分方式不是一成不变的,也可以根据实际情况进行调整。
4)可能要扩展到多机分布的用进程,多核分布的用线程
创建进程:
Python的os模块封装了常见的系统调用,其中就包括fork,可以在Python程序中轻松创建子进程,但fork()函数只能在Linux上面使用:
import os
#注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以 pid = os.fork() if pid == 0: print('哈哈1') else: print('哈哈2')
而在windows上面使用multiprocessing模块来创建多进程,这模块是跨平台的多进程模块
multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束:
#coding=utf-8
from multiprocessing import Process
import os
#子进程要执行的代码
def run_proc(name):
print('子进程运行中,name= %s ,pid=%d...' % (name, os.getpid()))
if name==‘main’:
print('父进程 %d.' % os.getpid()) p = Process(target=run_proc, args=('test',)) print('子进程将要执行') p.start() p.join() print('子进程已结束')
Process([group [, target [, name [, args [, kwargs]]]]])
· target:表示这个进程实例所调用对象;
· args:表示调用对象的位置参数元组;
· kwargs:表示调用对象的关键字参数字典;
· name:为当前进程实例的别名;
· group:大多数情况下用不到;
Process类常用方法:
· is_alive():判断进程实例是否还在执行;
· join([timeout]):是否等待进程实例执行结束,或等待多少秒;
· start():启动进程实例(创建子进程);
· run():如果没有给定target参数,对这个对象调用start()方法时,就将执行对象中的run()方法;
· terminate():不管任务是否完成,立即终止;
Process类常用属性:
· name:当前进程实例别名,默认为Process-N,N为从1开始递增的整数;
· pid:当前进程实例的PID值;
上一篇: python多线程多进程
下一篇: Android代码优化