线程池不关闭,python进程池中不运行
介绍
启动一个新线程的成本相对较高,因为它涉及到与操作系统的交互。在这种情况下,使用线程池可以提高性能,特别是当程序中需要创建大量的短生命线程时,就要考虑使用线程池。
当系统启动时,线程池会创建大量的空闲线程。只要一个程序向线程池提交一个函数,线程池就会启动一个空闲线程来执行它。线程不会死亡,而是会再次返回线程池,变成空闲,等待下一个函数执行。
此外,使用线程池可以有效地控制系统中并发线程的数量。当系统中有大量并发线程时,系统性能会急剧下降,甚至Python解释器也会崩溃。线程池的最大线程参数可以控制系统中并发线程的数量不超过这个数。
线程池的使用
线程池的基类是concurrent.funtures模块中的执行器,执行器提供了两个子类,ThreadPoolExecutor和ProcessPoolExecutor,其中ThreadPoolExecutor用于创建线程池,ProcessPoolExecutor用于创建进程池。
如果用线程池/进程池来管理并发编程,那么只要把相应的任务函数提交给线程池/进程池,剩下的就由线程池/进程池来解决。
Executor提供了以下常用方法:
Submit(fn,*args,*kwargs):将fn函数提交到线程池,*args表示传递给fn函数的参数,*kwargs表示作为fn函数的关键字参数传入的参数。
Map(func,*iterables,timeout=none,chunksize=1):这个函数类似于全局函数Map (func,* iterables),只是它会启动多个线程,并立即以异步方式对iterables执行map处理。
Shutdown(wait=True):关闭线程池
程序任务函数提交到线程池后,submit方法会返回一个Future对象,Future类主要获取线程任务函数的返回值。因为线程任务会在新线程中异步执行,线程执行的函数相当于一个未来要完成的任务,所以Python用Future作为代表。
未来提供了以下方法:
Cancel():取消这个Future所代表的线程任务。如果任务正在执行且无法取消,则该方法返回False;否则,程序将取消任务并返回True。
Canceled():返回由Future表示的线程任务是否被成功取消。
Running():如果这个Future所代表的线程任务正在执行,并且不能取消,这个方法返回True。
Done():如果这个Future代表的线程任务被成功取消或执行,这个方法返回True。
Result(timeout=None):获取这个Future所代表的线程任务最终返回的结果。如果Future代表的线程任务还没有完成,这个方法会阻塞当前进程,其中timeout参数指定最后阻塞多少秒。
Exec (timeout=none):获取这个Future所代表的线程任务抛出的异常。如果任务成功完成且无异常,则该方法返回None。
Add_done_callback(fn):为这个函数代表的线程任务注册一个回调函数。当任务成功完成时,程序将自动触发此fn功能。
在线程池用完之后,应该调用线程池的shutdonw()方法,这将启动线程池关闭序列。调用shutdown()方法后,线程池将不再接受新任务,但所有以前提交的任务都将完成。当线程池中的所有任务完成后,线程池中的所有线程都将死亡。
示例:
fromconcurrent.futures中的线程池导入线程池执行器
导入线程
导入时间
#定义要用作线程任务的函数
定义动作(最大):
mysum=0
对于I in范围(最大值):
mysum=i
print(threading.current_thread()。name str(i))returnmysum
#创建一个包含2个线程的线程池
使用ThreadPoolExecutor(max _ workers=2)作为池:
#向线程池提交一个任务,50将作为action()函数的参数
future1=pool.submit(action,10)
#向线程池提交另一个任务,100将作为action()函数的参数
future2=pool.submit(action,5)
定义获取结果(未来):
print(future.result())
#为将来的线程完成添加回调函数1
未来1。添加完成回调(获取结果)
# 为未来2添加线程完成的回调函数
未来2。添加完成回调(获取结果)
打印(-结束-)
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。