【ArcPy工具箱】多线程运行且可以正常停止运行
在一个程序中,能独立运行的程序片段叫作“线程”(Thread)
多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。
多线程是并行化的一种形式,或者是拆分工作以便同时进行处理。线程化的程序将工作拆分到多个软件线程,而不是将大量工作交给单个内核。这些线程由不同的 CPU 内核并行处理,以节省时间。
多进程和多线程有什么区别? A: 多进程和多线程的主要区别在于进程之间共享内存空间,而线程不共享内存空间。多进程编程通常用于解决内存安全问题,而多线程编程通常用于解决并发性能问题。
multiprocessing库是Python的一个内置库,它提供了一系列用于创建和管理多进程的工具。concurrent.futures库则是Python 3.2引入的一个新库,它提供了一种更简洁的并行编程方法,使用Future对象来表示异步任务的执行结果。
两者区别与联系可以查看一下文章
Python的并行编程:multiprocessing与concurrent.futures-博客
问题
在以往单独使用multiprocessing模块时会导致arcpy制作的工具箱运行后点击停止,无法停止,以下是记录我之前使用的方法。
from multiprocessing.dummy import Pool as ThreadPool
import multiprocessing
# 多线程调用计算
pool = ThreadPool(multiprocessing.cpu_count())
pool.apply_async(函数名, (参数1,参数2,参数...))
pool.close() # 关闭进程池,不再接受新的进程
pool.join() # 主进程阻塞等待子进程的退出
AI写代码python
运行
在arcpy中使用
结果

代码
会出错的代码展示
利用以下方式,运行结果会少很多,导致结果不准确
from multiprocessing
from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(multiprocessing.cpu_count())
executor.submit(函数名称, 参数1,参数2,参数...)
AI写代码python
运行
正确代码展示
from multiprocessing import cpu_count
import concurrent.futures
def max_workers():
max_workers = 2
cpus = cpu_count()
if cpus > 2:
max_workers = (cpus - 1)
return max_workers
#其他函数中使用
with concurrent.futures.ThreadPoolExecutor(max_workers()) as executor:
executor.submit(函数名称, 参数1,参数2,参数...)
AI写代码python
运行

总结
运行时间:未使用多线程的情况下7分32秒,使用多线程的情况下35秒,multiprocessing和concurrent.futures运行的时间是一致的
简洁性:concurrent.futures比multiprocessing代码量少很多
参考文献:
multiprocessing和concurrent.futures_multiprocessing和concurrent.futures.process有啥不同-博客
