# 导入concurrent.futures模块
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import datetime
# 线程的执行方法
def print_value(value):
print('Thread' + str(value))
# 每个进程里面的线程
def myThread(value):
Thread = ThreadPoolExecutor(max_workers=2)
Thread.submit(print_value, datetime.datetime.now())
Thread.submit(print_value, datetime.datetime.now())
# 创建两个进程,每个进程执行myThread方法,myThread主要将每个进程通过线程执行
# 如果不填写max_workers=2,会根据计算机的每一个CPU创建一个Python进程,如果四核就创建四个进程
def myProcess():
pool = ProcessPoolExecutor(max_workers=2)
pool.submit(myThread, datetime.datetime.now())
pool.submit(myThread, datetime.datetime.now())
if __name__ == '__main__':
myProcess()
在上述代码中,创建了进程 ProcessPoolExecutor 和线程 ThreadPoolExe中又创建了两个线程。下面简单讲述一下concurrent futures属性和方法。
(1) Executor:Executor是一个抽象类,它不能被直接使用。为具体的异步执行定义了基本方法:ThreadPoolExecutor和 ProcessPoolExecut 继承了 Executor,分别被用来创建线程池和进程池的代码
(2)创建进程和线程之后, Executor 提供了 submite 和 map 方法最大的区别是参数类型,map 的参数必须是列表、元组和选代器的数据类型
(3) Future:可以理解为一个在未来完成的操作,这是异步编程IO操作和访问URL时,在等待结果返回之前会产生阻塞,cpu不能做其他事情,Furure 帮助我们在等待的这段时间可以完成其他的操作
def myProcess():
with ProcessPoolExecutor(max_workers=2) as pool:
for i in range(1,3):
pool.submit(myThread,i,datetime.datetime.now())
可以用循环设置多个进程线程