34 线程的其他方法 队列 线程池 协程
今日内容:
1 线程的其他方法
2 线程队列 (重点)
3 线程池(重点)
4协程
生成器
Greenlet模块
Gevent模块(重点)
今日内容回顾:
线程的其他方法:
Threading.current_thread() #当前线程对象
GetName() 获取线程名
Ident 获取线程id
Threading.Enumerate() #当前正在运行的线程对象的一个列表
Threading.active_count() #当前正在运行的线程数量
线程队列:(重点)
Import queue
先进先出队列:queue.Queue(3)
先进后出\后进先出队列:queue.LifoQueue(3)
优先级队列:queue.priorityQueue(3)
Put的数据是一个元组,元组的第一个参数是优先级数字,数字越小优先级越高,越先被get到被取出来,第二个参数是put进去的值,如果说优先级相同,那么值别忘了应该是相同的数据类型,字典不行
线程池:
From concurrent_futures import ThreadPoolExecutor,ProcessPoolExecutor
P = ThreadPoolExecutor(4) #默认的线程个数是cpu个数 * 5
P = ProcessPoolExecutor(4) #默认的进程个数是cpu个数
P.map(f1,可迭代的对象) #异步执行
Def f1(n1,n2):
Print(n1,n2)
P.submit(f1,11,12) #异步提交任务
Res = P.submit(f1,11,12)
Res.result() #和get方法一样,如果没有结果,会等待,阻塞程序
Shutdown() #close+join,锁定线程池,等待线程池中所有已经提交的任务全部执行完毕
今日作业
- 多线程实现 一个socket并发聊天,就是一个服务端同时与多个客户端进行沟通
- 写一个简易的socketserver
- 通过线程池做爬虫,通过回调函数来清洗爬取回来的数据,简单写,就是将爬取回来的网页内容,通过正则来匹配一些其中的内容,匹配其中的链接网址