-
python3教程之PythonI/O进阶学习笔记_10.python的多线程(4)
为什么done()输出的是false呢。因为submit的返回是非阻塞的,没有等task执行完就返回了task done的状态。
如果隔几秒输出done()的返回又是true了。
Future对象常用的其他方法:cancel()
取消该 Future 代表的线程任务。如果该任务正在执行,不可取消,则该方法返回 False;否则,程序会取消该任务,并返回 True。
print(task1.done()) print(task1.cancel()) print(task2.done()) #result 是阻塞的,接受函数的返回 print(task1.result()) print(task2.result()) output: False False False get html page 2 successed! get html page 3 successed! 3 2
cancelled():返回 Future 代表的线程任务是否被成功取消。
2.获取所有完成的future的状态和值as_completed和map
2.1 .as_complete
from concurrent.futures import ThreadPoolExecutor,as_completed import time def get_html(uid): time.sleep(uid) url="www.test.com/{}".format(uid) print("get url successed: \" {} \"".format(url)) return uid excutor=ThreadPoolExecutor(max_workers=2) uids=[5,2,3] future_list=[ excutor.submit(get_html,(uid)) for uid in uids] for future in as_completed(future_list): print(future.result()) #output: get url successed: " www.test.com/2 " 2 get url successed: " www.test.com/5 " 5 get url successed: " www.test.com/3 " 3
as_completed():yield 所有完成的futures的所有返回。
那么as_complete是如何做到收集所有完成的异步方法的状态的呢?
先把所有已经是finish状态的future返回,
再一直while pending,等待timeout范围内的future变成finish,把finish的future yield出来。
from concurrent.futures import ThreadPoolExecutor,as_completed import time def get_html(uid): time.sleep(uid) url="www.test.com/{}".format(uid) print("get url successed: \" {} \"".format(url)) return uid excutor=ThreadPoolExecutor(max_workers=2) uids=[5,2,3] future_list=[ excutor.submit(get_html,(uid)) for uid in uids] for future in as_completed(future_list): print(future.result()) #output: get url successed: " www.test.com/2 " 2 get url successed: " www.test.com/5 " 5 get url successed: " www.test.com/3 " 3
2.2 通过excutor的map方法 获取已经完成的future
excutor的map,和map是差不多的,传递函数和参数列表,就会多多线程运行参数列表数的线程。
与a中不一样的是,map返回的顺序和url中的顺序是一样的,而a的as_completed是谁先finishi谁就先被yield出来。
而且map返回的就是result,而as_completed返回的是Future。
from concurrent.futures import ThreadPoolExecutor,as_completed,wait import time def get_html(uid): time.sleep(uid) url="www.test.com/{}".format(uid) print("get url successed: \" {} \"".format(url)) return uid excutor=ThreadPoolExecutor(max_workers=2) uids=[5,2,3] result_list=excutor.map(get_html,uids) for result in result_list: print(result) #output: get url successed: " www.test.com/2 " get url successed: " www.test.com/5 " 5 2 get url successed: " www.test.com/3 " 3
3.wait()方法
wait方法用于阻塞,指定某一个task或者一些task执行完成再往下执行。
def wait(fs, timeout=None, return_when=ALL_COMPLETED)
例:如果我想在全部task执行完之后打印"task end"字符串
from concurrent.futures import ThreadPoolExecutor,as_completed,wait import time def get_html(uid): time.sleep(uid) url="www.test.com/{}".format(uid) print("get url successed: \" {} \"".format(url)) return uid excutor=ThreadPoolExecutor(max_workers=2) uids=[5,2,3] future_list=[ excutor.submit(get_html,(uid)) for uid in uids] print("task end") #output: task end get url successed: " www.test.com/2 " get url successed: " www.test.com/5 " get url successed: " www.test.com/3 " #还没有执行完,就输出了 task end。需要加上: wait(future_list) print("task end") #output: get url successed: " www.test.com/2 " get url successed: " www.test.com/5 " get url successed: " www.test.com/3 " task end
wait还可以指定在什么时候执行完后返回。
栏目列表
最新更新
python数据库连接池技术总结
python数据库连接池技术总结
成人网站性能提升 20 倍之经验谈 [Python
python动态捕获异常
python 探测网站目录的GUI程序
python实现中文字符繁体和简体中文转换
Python服务器开发 -- 网络基础
python高性能编程方法一
使用python管理Cisco设备
python抓取google搜索结果
基于UDP的服务器端和客户端
再谈UDP和TCP
在socket编程中使用域名
网络数据传输时的大小端问题
socket编程实现文件传输功能
如何优雅地断开TCP连接?
图解TCP四次握手断开连接
详细分析TCP数据的传输过程
图解TCP数据报结构以及三次握手(非常详
TCP协议的粘包问题(数据的无边界性)
Excel数据导入到Sql server
SQL Server like 字段
SQL Server中的LEFT、RIGHT函数
sql server 安装出现需要sqlncli.msi文件,错误
SQL Server学习内容(一)
SQLServer执行大脚本文件时,提示“无法执
数据库敏捷版本控制之3个数据库策略
将select 转为json
SQL Server 创建索引(index)
GROUP BY中的WITH CUBE、WITH ROLLUP原理测试及