1、线程池ThreadPoolExecutor
"""
线程池,使用单核CPU
"""
from concurrent.futures import ThreadPoolExecutor
import random
import time
import threading
from datetime import datetime
import multiprocessing
import numpy as np
def print_func(x):
sleep_time = random.randint(1, 10)
sleep_time = 2
time.sleep(sleep_time)
# 线程中进行大计算量,观察CPU使用情况,使用单核CPU
x1 = np.random.rand(1000, 1000)
x2 = np.random.rand(1000, 1000)
y = np.matmul(x1, x2)
print("current time: {}, process id: {}, thread id: {}, get: {}, sleep time: {}s".format(
datetime.now().strftime("%Y-%m-%d %H:%M:%S"), multiprocessing.current_process().ident,
threading.currentThread().ident,
x, sleep_time))
return x
print("strart time: {}".format(datetime.now().strftime("%Y-%m-%d %H:%M:%S")))
pool = ThreadPoolExecutor(max_workers=4)
task_list = []
for i in range(50):
# 默认异步提交任务到线程池
task = pool.submit(print_func, i)
task_list.append(task)
"""
status = task.done()
# 同步等待线程返回结果
while not status:
status = task.done()
# 线程执行完成后,done()返回为True,获取线程返回结果
result = task.result()
# print("result: {}".format(result))
"""
for task in task_list:
while not task.done():
continue
print(task.result())
end_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print("end time: {}".format(end_time))
2、进程池ProcessPoolExecutor
"""
进程池,使用多核CPU
"""
from concurrent.futures import ProcessPoolExecutor
import random
import time
import threading
from datetime import datetime
import multiprocessing
import numpy as np
def print_func(x):
sleep_time = random.randint(1, 10)
sleep_time = 2
time.sleep(sleep_time)
x1 = np.random.rand(1000, 1000)
x2 = np.random.rand(1000, 1000)
y = np.matmul(x1, x2)
print("current time: {}, process id: {}, thread id: {}, get: {}, sleep time: {}s".format(
datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
multiprocessing.current_process().ident,
threading.currentThread().ident,
x, sleep_time))
return x
if __name__ == '__main__':
print("strart time: {}".format(datetime.now().strftime("%Y-%m-%d %H:%M:%S")))
pool = ProcessPoolExecutor(max_workers=4)
task_list = []
for i in range(50):
# 默认异步提交任务到进程池
task = pool.submit(print_func, i)
task_list.append(task)
"""
status = task.done()
# 同步等待进程返回结果
while not status:
status = task.done()
# 进程执行完成后,done()返回为True,获取进程返回结果
result = task.result()
print("result: {}".format(result))
"""
for task in task_list:
while not task.done():
continue
print(task.result())
end_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print("end time: {}".format(end_time))