在测试Python的多线程时,根据官方的说法,concurrent.futures在Python3中已经内置了,不需要下载安装,如果是Python2则需要运行pip install futures进行安装。。。
这样导入,两种写法均可
import concurrent.futures
# from concurrent import futures
但是,,,我是python3.7,竟然给我报出了下面的错误,我直接裂开
ModuleNotFoundError: No module named 'concurrent'
网上没找到解决方法,我一度怀疑我的python3没有内置这个东西,或者被误删了,然后打开阿里云windows服务器,上面装的是Python3.8,在VSCode上面跑了一下代码,报了其他错误,不过还是给了我很大惊喜
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\concurrent\futures\process.py", line 102, in _python_exit
它给我提示了concurrent.futures模块在哪个位置!顺藤摸瓜找到之后,对比了一下,发现在相同的路径我的电脑缺少了一个文件夹!难道是我误删了?
把concurrent文件夹拷贝到Python37\Lib下面,再次在本地运行代码,,哈哈,完美运行!
# # concurrent是异步的线程、进程包
# submit(function,argument):调度函数(可调用的对象)的执行,将argument作为参数传入
# map(function,argument):将argument作为参数执行函数,以异步的方式
# from concurrent.futures import ThreadPoolExecutor(max_workers) # 线程池
# from concurrent.futures import ProcessPoolExecutor(max_workers) # 进程池
# max_workers 表示最多可并行执行多少任务
import concurrent.futures
# from concurrent import futures
import time
number_list=[i for i in range(1,11)]
def add_item(x):
result=count(x)
return result
def count(number):
for i in range(0,10000000):
i+=1
return i*number
if __name__ == '__main__':
# 单线程裸奔
s=time.time()
for item in number_list:
print(add_item(item))
print(time.time()-s)
# 线程池执行CPU密集型任务
s2=time.time()
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
futures=[executor.submit(add_item,item) for item in number_list]
for future in concurrent.futures.as_completed(futures):
print(future.result())
print(time.time()-s2)
# 进程池执行CPU密集型任务
s3=time.time()
with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor:
futures=[executor.submit(add_item,item) for item in number_list]
for future in concurrent.futures.as_completed(futures):
print(future.result())
print(time.time()-s3)
因为是计算密集型任务,多进程还是比多线程要快不少的,多线程适用于I/O密集型任务
最后我把concurrent文件夹压缩上传到了网盘里面,附上链接