python学习之j进程和线程:

每个进程至少有一个线程,python因为每个线程都共用一个GIL全局锁(同时只能运行一个线程),所以不能用多线程(除非重新写C解释器),但是多进程的GIL锁各自独立可多进程。

进程与线程的区别在于一个变量在多线程中都可改变相互影响可通过互斥锁来解决。而多进程相当于各有一个拷贝互不影响。

 多进程比较消耗系统资源,但稳定性高。

多线程:速度快,但稳定性不高

计算密集型和IO密集型任务:

  计算密集型,任务越多效率越低,适合效率高的C语言

     IO密集型:因为任务与MCU存在速度上的巨大差异,单任务的等待会消耗大量的无效MCU时间。如果任务越多并发执行,效率越高,适合开发效率较高的python语言。但为了避免死等可以用异步的’协程‘提高对异步事件驱动型的响应

     分布式进程:Python multiprocessing 模块不但支持多进程,其中 managers 子模块还支持把多进程分布到多台机器上 ,注意,当我们在一台机器上写多进程程序时,创建的 Queue 可以直接
拿来用,但是,在分布式多进程环境下,添加任务到 Queue 不可以直接对原始的 task_queue 进行操作,那样就绕过了 QueueManager 的封装,必须通过 manager.get_task_queue()获得的 Queue 接口添加

一 相关模块:threading, multiprocessing

1.1 创造线程t1 = threading.Thread(target=run_thread, args=(5,))

     执行线程:t1.start()

     等待线程结束:t1.join()若不能结束则需强制结束.terminate(), 属性threading.current_thread().name    

二互斥锁:lock = threading.Lock(),申请:lock.acquire();释放:lock.release()

三 多线程共享数据:互斥信号量ThreadLocal,

3.1 定义 local_school = threading.local()

3.2 使用:在各模块中修改local_school.object

四:协程:协程相当于加了中断功能的子程序,子程序有一个入口一个出口,出来了才能干其它事情,而协程是利用genarator生成器(generator 中,我们不但可以通过 for 循环来迭代,还可以不断调用
next()函数获取由 yield 语句返回的下一个值
),而在协程里yeil不但可以返回一个值,它还可以接收调用者发出的参数 ,在生产消费者类型里面,生产者通过一个一个生成器传参数r = c.send(n) ,而消费者通过n =yeid r或的参数,并修改r参数,然后又回到生产者中调用r.

4.1异步IO协程(并发完成):asyncio (Python 3.4)提供了完善的单线程异步 IO 并发操作支持,在客户端的意义不大但在服务器中则非常好用,asyncio 实现了 TCPUDPSSL 等协议, aiohttp(须安装) 则是基于 asyncio
现的 HTTP 框架
;异步操作需要在 coroutine 中通过 yield from 完成;多个 coroutine 可以封装成一组 Task 然后并发执行为了简化并更好地标识异步 IO,从 Python 3.5 开始引入了新的语法 async
await,可以让 coroutine 的代码更简洁易读 ,只是些语法替换。

import asyncio
@asyncio.coroutine  #用async 替代在def前
def func(host):
    yied from            #用await替代。

loop = asyncio.get_event_loop()
tasks = [wget(host) for host in ['www.sina.com.cn', 'www.sohu.com',
'www.163.com']]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

 

原文地址:https://www.cnblogs.com/jieruishu/p/6954307.html