【代码记录】多线程示例代码
用多线程处理多gpu模型输入的时候写的,感觉复用性会很不错,用以记录和分享
import threading
def multithreadhelper(workfn,alldata:list,number:int):
# workfn takes only one argument: a example of alldata
# data preparation
def chunk_data(data, chunksize):
for i in range(0, len(data), chunksize):
yield data[i:i + chunksize]
chunk_size = (len(alldata)+number-1) // number
if chunk_size == 0:
chunk_size = 1
chunks = list(chunk_data(alldata, chunk_size))
# multi thread logic
global results
results = []
results_lock = threading.Lock()
def workgroupfn(datalist):
localresults = [workfn(datapoint) for datapoint in datalist]
with results_lock:
results.extend(localresults)
threads = []
for chunk in chunks:
thread = threading.Thread(target=workgroupfn,args=(chunk,))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
return results
GPT-4o对代码的解释如下:
这个代码定义了一个名为 multithreadhelper 的函数,它的作用是并行处理数据列表 alldata 中的每个元素,使用指定的工作函数 workfn 来处理数据。在多线程环境中进行数据处理可以提高效率,特别是在数据量大或者计算过程较为复杂的情况下。
下面是代码中的关键部分及其功能的简要说明:
- 数据分块:
使用 chunk_data 函数将 alldata 划分为多个小块(chunk)。每个块的大小由 number 参数决定,表示要使用的线程数量。
chunk_size 计算分块的大小,确保所有数据都能被处理。
- 多线程设置:
使用全局变量 results 来存储最终的处理结果,并使用 results_lock 来确保在多线程环境中对 results 的访问是线程安全的。
在 workgroupfn 函数中,传递的每个数据块(datalist)中的每个数据点都通过工作函数 workfn 进行处理,并将处理结果存储在 localresults 中。随后,使用锁将这些结果合并到全局的 results 列表中。
创建并启动线程:
为每个数据块创建一个线程,将其指向 workgroupfn 函数,并传入相应的数据块。在启动线程后,函数会等待所有线程完成(通过 thread.join())。
返回结果:
最后,返回合并后的 results,即所有数据点经过 workfn 处理后的结果列表。
简单来说,这段代码的主要功能是:通过将数据分块并使用多个线程并行处理这些块来提高数据处理的效率。