线程池与进程池

1、线程池

从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutorProcessPoolExecutor两个类,实现了对threadingmultiprocessing的更高级的抽象,是使用异步实现,充分利用CPU提高程序执行效率,对编写线程池/进程池提供了直接的支持,而传统的进程池/线程池是使用阻塞式实现的;python2.7版本可以安装futures模块,使用方式和python3一样。
其中:concurrent.futures基础模块是executor和future

ThreadPoolExecutor:适用于IO密集型任务,受GIL影响,还是只能利用单核CPU资源

ProcessPoolExecutor:适用于计算密集型,可以充分利用多核CUP,会以子进程的形式,平行的运行多个解释器,子进程与主解释相分离,每个子进程都可以完整的利用一个CPU内核,实现真正的平行计算;但是多进程会增大系统开销,主进程和子进程之间进行通信必须进行序列化和反序列化操作

调用线程池的简化代码:

from concurrent.futures import wait, ALL_COMPLETED, ThreadPoolExecutor, as_completed
# as_completed返回一个执行状态的迭代器
with ThreadPoolExecutor(max_workers=workers) as executor:
	# executor.submit提交到任务列表,并返回一个可调用执行的future
	future_do_job = {executor.submit(get_one_subdns, domain): domain for domain in domains}
	# wait等待所有任务都执行完毕才返回,return_when控制返回状态,timeout控制最大等待时间
	for future in as_completed(future_do_job, timeout=600):
		try:
			# future.done判断任务是否执行结束
			if future.done():
				# future.result获取任务执行的返回结果
				sub_domains = future.result()
				print('{}: {}'.format(future_do_job[future], sub_domains))
				if len(sub_domains) > 0:
					all_subdns.extend(sub_domains)
		except Exception as e:
			print(e)
			future.cancel()

# wait返回两个set列表,分别为已经完成的和未完成的
with ThreadPoolExecutor(max_workers=workers) as executor:
	# executor.submit提交到任务列表,并返回一个可调用执行的future
	future_do_job = {executor.submit(dns_resolve, domain): domain for domain in all_domains}
	# wait等待所有任务都执行完毕才返回,return_when控制返回状态,timeout控制最大等待时间
	done_futures, not_done_futures = wait(future_do_job, timeout=600, return_when=ALL_COMPLETED)
	for future in done_futures:
		domain = future_do_job[future]
		try:
			ips = future.result()
			print('{}: {}'.format(domain, ''.join(ips)))
			for ip in ips:
				ip_rele_domains[ip].add(domain)
		except Exception as e:
			print('{} dns resolve failed, Exception is {}'.format(domain, str(e)))
			future.cancel()

	for future in not_done_futures:
		domain = future_do_job[future]
		print('{} dns resolve failed'.format(domain))
		future.cancel()
""" 异步线程池可以直接获得函数返回结果 """
from concurrent.futures import ThreadPoolExecutor
import time

def return_future_result(message):
    time.sleep(2)
    return message

pool = ThreadPoolExecutor(max_workers=2)  # 创建一个最大可容纳2个task的线程池
future1 = pool.submit(return_future_result, ("hello"))  # 往线程池里面加入一个task
future2 = pool.submit(return_future_result, ("world"))  # 往线程池里面加入一个task
print(future1.done())  # 判断task1是否结束
time.sleep(3)
print(future2.done())  # 判断task2是否结束
print(future1.result())  # 查看task1返回的结果
print(future2.result())  # 查看task2返回的结果

concurrent.futures的详细使用参见如下链接:

https://blog.csdn.net/dutsoft/article/details/54728706

threading 多线程控制和处理

python如何充分利用多核CPU

线程池和进程池的使用方式类似,只需将Thread换成Process

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值