分组执行Python线程

分组执行Python线程,python,python-multithreading,Python,Python Multithreading,我正在尝试使用python将一些(100)数据集插入SQL server。我使用多线程在一个循环中创建100个线程。所有这些都是同时启动的,这使数据库陷入困境。我想将我的线程分组为5个线程,一旦分组完成,我想开始下一组线程,依此类推。由于我是python和多线程新手,非常感谢您的帮助。请在下面找到我的代码 for row in datasets: argument1=row[0] argument2=row[1] jobs=[] t

我正在尝试使用python将一些(100)数据集插入SQL server。我使用多线程在一个循环中创建100个线程。所有这些都是同时启动的,这使数据库陷入困境。我想将我的线程分组为5个线程,一旦分组完成,我想开始下一组线程,依此类推。由于我是python和多线程新手,非常感谢您的帮助。请在下面找到我的代码

for row in datasets:
        argument1=row[0]
        argument2=row[1]
        jobs=[]
        t = Thread(target=insertDataIntoSQLServer, args=(argument1,argument2,))
        jobs.append(t)
        t.start()
for t in jobs:
    t.join()

您可以创建
ThreadPoolExecutor
并指定
max\u workers=5

您可以使用
functools.partial
将函数转换为所需的0参数函数


编辑:您可以在
向执行者提交
时,将参数与函数名一起传递。罗兰·史密斯,谢谢你提醒我,
partial
是个坏主意。有一种更好的方法。

在Python2和Python3上,可以使用
多处理.ThreadPool
。这就像一个
多处理.Pool
,但使用线程而不是进程

import multiprocessing

datasets = [(1,2,3), (4,5,6)]  # Iterable of datasets.

def insertfn(data):
    pass # shove data to SQL server

pool = multiprocessing.ThreadPool()

p.map(insertfn, datasets)
默认情况下,
将创建与CPU核心数量相同的工作线程。使用更多线程可能不会有帮助,因为它们将争夺CPU时间

注意,我已经将数据分组到元组中。这是一种绕过池工作人员一个参数限制的方法


在Python3上,您还可以使用
ThreadPoolExecutor


但是请注意,在具有全局解释器锁的Python实现(如“标准”CPython)上,一次只能有一个线程执行Python字节码。因此,使用大量线程不会自动提高性能。线程可能有助于执行I/O绑定的操作。如果一个线程正在等待I/O,则另一个线程可以运行。

首先请注意,您的代码没有按预期工作:它在每次循环中都将
作业设置为空列表,因此循环结束后,您只需创建
join()
最后一个线程

因此,通过将
作业=[]
移出循环来修复这个问题。在这之后,您可以通过在
t.start()之后添加以下内容来获得您想要的:


我个人会使用某种类型的池(如其他答案所示),但很容易直接得到您的想法。

谢谢您的快速回复。当我使用ThreadPool Executor时,我需要加入ThreadPool吗?您不需要加入。如果您的使用需要它,那么它是可能的:函数应该有一个参数。请注意,
functools.partial
只能用于每个调用都相同的参数!感谢您的回复。我已经尝试使用pool.map,但它只接受1个参数。我需要向insertfn发送多个参数。我还没有尝试使用functools.partial将我的函数转换为零参数函数。您还可以将参数分组为元组。然后,此元组将计为一个参数。:-)您应该使用
functools.partial
来处理函数每次调用都相同的参数。
ThreadPoolExecutor
已经在Python 2.7中使用过。
if len(jobs) == 5:
    for t in jobs:
        t.join()
    jobs = []