分组执行Python线程
我正在尝试使用python将一些(100)数据集插入SQL server。我使用多线程在一个循环中创建100个线程。所有这些都是同时启动的,这使数据库陷入困境。我想将我的线程分组为5个线程,一旦分组完成,我想开始下一组线程,依此类推。由于我是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
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 = []