Python线程错误 - 必须是可迭代的,而不是整数。

26
我试图在数据框的第一列和其他列之间计算滚动回归的R平方值(第一列和第二列,第一列和第三列等)。但是当我尝试使用多线程时,它一直告诉我错误:

TypeError: ParallelRegression() argument after * must be an iterable, not int"。

我想知道该怎么解决?非常感谢!

import threading

totalThreads=3 #three different colors
def ParallelRegression(threadnum):
    for i in range(threadnum):
        res[:,i]=sm.OLS(df.iloc[:,0], df.iloc[:,i+1]).fit().rsquared
threads=[]
for threadnum in range(totalThreads):
    t=threading.Thread(target=ParallelRegression,args=(threadnum))
    threads.append(t)
    t.start()
for threadnum in range(totalThreads):
    threads[threadnum].join()

请查看以下链接中的图片,该图片展示了数据(df)的概要信息:

enter image description here


5
"args=(threadnum)" 看起来可能是笔误。 args 应该是一个元组吗? 只有一个元素的元组需要加上逗号:args=(threadnum,) - Kevin
2个回答

45

threading.Thread类需要将一个可迭代参数作为args参数传入。你目前传递的是args=(threadnum),它只包含了一个int对象,你需要传递一些可以允许多个参数的可迭代对象,即使你只想传递一个参数。

args=[threadnum]可以工作,因为它创建了一个list对象,该对象是可迭代的。


为什么要回答那些可能被视为打字错误的问题,而且已经被问过和回答了无数次呢?这个重复的问题是我在谷歌上的第一个结果,只用了5秒钟就找到了。 - Aran-Fey
1
args更改为列表在我的机器上可以工作,我希望它也适用于大多数Python发行版/环境,但我认为这是一个不应该依赖的实现细节。 Thread的文档仅说明args是“目标调用的参数元组”。如果您提供的不是元组,请自行承担风险。 - Kevin
3
@Aran-Fey为什么不回答?回答问题会被看作是不好的吗? - nosklo
回答明显的重复问题是不受欢迎的。如果你想知道为什么:因为我们把所有的答案放在一个地方更好。 - Aran-Fey
请查看如何处理重复问题? - Aran-Fey

11
有另一种解决方案:在“threadnum”末尾添加逗号。
t=threading.Thread(target=ParallelRegression,args=(threadnum,))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接