参考博客:
线程、进程、协程:
http://www.cnblogs.com/wupeiqi/articles/5040827.html

http://www.cnblogs.com/alex3714/articles/5230609.html

IO多路复用:
http://www.cnblogs.com/wupeiqi/articles/5040823.html

课堂笔记:

- 线程进程介绍
1. 工作最小单元是线程
2. 应用程序 -> 至少有一个进程 -> 至少有一个线程
3. 应用场景:
IO密集型:线程
计算密集型:进程
4. GIL,全局解释器锁。
- 保证同一个进程中只有一个线程同时被调度
- 线程
1. 基本使用
def task(arg):
time.sleep(arg)
print(arg)

for i in range(5):
t = threading.Thread(target=task,args=[i,])
# t.setDaemon(True) # 主线程终止,不等待子线程
# t.setDaemon(False)
t.start()
# t.join() # 一直等
# t.join(1) # 等待最大时间
2. 锁
# 1. 只能有一个人使用锁
# lock = threading.Lock() # 只能开一把
# lock = threading.RLock()# 可以开多把
# 2. 多个人同时使用锁
# lock = threading.BoundedSemaphore(3)
# 3. 所有的解脱锁的限制
# lock = threading.Event()
# 4. 肆意妄为
# lock = threading.Condition()

3. 线程池
模式一:直接处理
def task(url):
"""
任务执行两个操作:下载;保存本地
"""
# response中封装了Http请求响应的所有数据
# - response.url 请求的URL
# - response.status_code 响应状态码
# - response.text 响应内容(字符串格式)
# - response.content 响应内容(字节格式)
# 下载
response = requests.get(url)

# 下载内容保存至本地
f = open('a.log','wb')
f.write(response.content)
f.close()

pool = ThreadPoolExecutor(2)
url_list = [
'http://www.oldboyedu.com',
'http://www.autohome.com.cn',
'http://www.baidu.com',
]
for url in url_list:
print('开始请求',url)
# 去连接池中获取链接
pool.submit(task,url)

模式二:分步处理
def save(future):
"""
只做保存 # future中包含response
"""
response = future.result()

# 下载内容保存至本地
f = open('a.log','wb')
f.write(response.content)
f.close()

def task(url):
"""
只做下载 requests
"""
# response中封装了Http请求响应的所有数据
# - response.url 请求的URL
# - response.status_code 响应状态码
# - response.text 响应内容(字符串格式)
# - response.content 响应内容(字节格式)
# 下载
response = requests.get(url)
return response

pool = ThreadPoolExecutor(2)
url_list = [
'http://www.oldboyedu.com',
'http://www.autohome.com.cn',
'http://www.baidu.com',
]
for url in url_list:
print('开始请求',url)
# 去连接池中获取链接
# future中包含response
future = pool.submit(task,url)
# 下载成功后,自动调用save方法
future.add_done_callback(save)

- 进程
1. 基本使用
from multiprocessing import Process
import time
def task(arg):
time.sleep(arg)
print(arg)

if __name__ == '__main__':
for i in range(10):
p = Process(target=task,args=(i,))
p.daemon = True
# p.daemon = False
p.start()
p.join(1)

print('主进程最后...')

2. 进程之间的数据共享
特殊的东西
- Array(‘类型’,长度)
- Manager().list() / Manager().dict()

3. 进程池

================== 结论 ==================
IO密集:线程
计算密集:进程

- 协程
pip3 install greenlet
协程永远是一个线程在执行,对线程的一个分片处理。

二次加工:
自定义:
select实现
现成 :
pip3 install gevent

- IO多路复用
监听多个socket对象是否有变化(可读,可写,发送错误)
- 示例一:

- socketserverIO
- IO多路复用
- 线程
- 自定义异步非阻塞的框架

本周作业:
服务端:socketserver
用IO多路复用select,使用“伪”并发

客户端:
基本操作:
聊天
上传

尝试:
客户端是否可以用select来实现???

转载于:https://www.cnblogs.com/liyongsan/p/6580256.html

Python之路,Day9 - 线程、进程、协程和IO多路复用相关推荐

  1. python线程进程协程面试_Python学习经验之谈:关于协程的理解和其相关面试问题...

    都知道Python非常适合初学者学习来入门编程,昨天有伙伴留言说面试了Python岗位,问及了一个关于协程的问题,想了想还是跟大家出一篇协程相关的文章和在Python面试中可能会问及的相关面试问题.都 ...

  2. python进程\协程\异步IO

    进程 学习python中有什么不懂的地方,小编这里推荐加小编的python学习群:895 817 687有任何不懂的都可以在里面交流,还有很好的视频教程pdf学习资料,大家一起学习交流! Python ...

  3. python异步和进程_12.python进程\协程\异步IO

    进程 Python中的多线程无法利用多核优势 , 所以如果我们想要充分地使用多核CPU的资源 , 那么就只能靠多进程了 multiprocessing模块中提供了Process , Queue , P ...

  4. python_21_线程+进程+协程

    python_线程_进程_协程 什么是线程? -- os能够进行运算调度的最小单位,被包含在进程之中,是一串指令的集合 -- 每个线程都是独立的,可以访问同一进程下所有的资源 什么是进程? -- 每个 ...

  5. 打开线程 | 进程 | 协程的大门

    不知从几何起,可能是大三那年的操作系统考试,也可能是刚经历完的秋招,这些概念总是迷迷糊糊,可能自己回答的和其他人的答复也差不多,并没有什么亮点,通常都会以:「我们换个题」的方式结束,有时候也挺尴尬的. ...

  6. 10-线程,进程,协程,IO多路复用

    - 线程进程介绍 1. 工作最小单元是线程 2. 应用程序 -> 至少有一个进程 -> 至少有一个线程 3. 应用场景: IO密集型:线程 计算密集型:进程 4. GIL,全局解释器锁. ...

  7. python协程和线程_python之并发编程(线程\进程\协程)

    一.进程和线程 1.进程 假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是 ...

  8. python apply_async死锁_python之并发编程(线程\进程\协程)

    一.进程和线程 1.进程假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是不 ...

  9. python(40)- 进程、线程、协程及IO模型

    一.操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式:向下管理硬件,向上提供接口. 操作系统进行进程切换:1.出现IO操作:2.固定时间. 固定时间很短,人感受不到.每一个应用层运行起 ...

最新文章

  1. 跟vczh看实例学编译原理——一:Tinymoe的设计哲学
  2. HTML哪些是块级元素,哪些是行内元素、
  3. 非常值得一看—九种滤波算法C语言实现
  4. KUKA通信 CREAD问题
  5. “根本就不需要 Kafka 这样的大型分布式系统!”
  6. linux 的内核参数优化,Linux服务器内核参数优化
  7. SpringMVC子父容器源码剖析
  8. 问题 I: A+B Problem : Input/Output Practice 山东科技大学OJ C语言
  9. Endianness
  10. Visual Studio 2013中因SignalR的Browser Link引起的Javascript错误一则
  11. easyui下拉选项多怎么解决_30岁以后皮肤松弛皱纹越来越多怎么办?这组瑜伽帮你解决...
  12. JAVA读取配置文件工具类
  13. python 读取outlook邮箱邮件小记
  14. 银耳椰椰——Alpha冲刺Day06
  15. php实现微信发红包程序,PHP实现微信发红包程序
  16. python爬取下厨房每周最受欢迎菜谱
  17. SPI接口的MISO和MOSI连接时注意
  18. 物联网常见概念总结(期末复习)
  19. MACbook Air 装win7 步骤
  20. “大数据应用场景”之隔壁老王(连载四)

热门文章

  1. html基础知识点列表
  2. java面试题八 传值传引用
  3. springmvc rest风格化案例
  4. 技术大牛收割机!Java之父James Gosling现在哪里???
  5. 某聊天工具消息记录数据库文件解密逆向分析
  6. 学习《apache源代码全景分析》之DSO概念
  7. 剑指offer 栈的压入、弹出序列
  8. scrapy需要的xpath知识点
  9. 深入JAVA注解之方法注解
  10. 设计算法时要确保分类讨论的完备性