python进程和线程
python 进程和线程
概念
GIL:
全局解释锁,解决了不同线程同时访问统一资源时,数据保护问题。python 虽然是多线程,但是因为GIL,实际上是是单线程,由CPU轮询,假线程。(一个线程运行一段时间后会释放GIL, 另一个线程获取GIL便会执行,然后再释放)
进程:
是具有一定独立功能的程序关于某个数据集合上的一次运行活动。进程是系统进行资源分配和调度的一个独立单位。(进程间通信方式:套接字,信号,管道,共享内存,消息队列)
线程:
是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位。(共享内存,变量,)
总结
多进程: 多用于(CPU密集型)计算密集型任务(cpu核越多速度越快)
多线程(伪线程): IO密集型任务,例如网络WEB服务器就是一个例子,每秒钟能处理多少个请求是web服务器的重要指标。
常见的消息机制
RabbitMQ ZeroMQ Kafka AWS SQS + BOTO
Python 开源框架对分布式的并发管理手段
-
Celery
Celery是一个非常成熟的Python分布式框架,可以在分布式的系统中,异步的执行任务,并提供有效的管理和调度功能。参考这里(http://my.oschina.net/taogang/blog/386077) -
SCOOP
SCOOP (Scalable COncurrent Operations in Python)提供简单易用的分布式调用接口,使用Future接口来进行并发。 -
Dispy
相比起Celery和SCOOP,Dispy提供更为轻量级的分布式并行服务 -
PP
PP (Parallel Python)是另外一个轻量级的Python并行服务, 参考这里(http://my.oschina.net/taogang/blog/386512) -
Asyncoro
Asyncoro是另一个利用Generator实现分布式并发的Python框架,
应用
线程: from multiprocessing.dummy import Pool (线程池(真线程))
#!/usr/bin/env python
from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadPool
import urllib2
urls = [
'http://www.baidu.com',
'http://www.taobao.com',
]
pool = ThreadPool(4)
# pool = Pool()
results = pool.map(urllib2.urlopen, urls)
pool.close()
pool.join()
#KeyboardInterrupt, SystemExit