Python threading error - must be an iterable, not int
Solution 1
threading.Thread
class needs an iterable of arguments as the args
parameter. You're passing args=(threadnum)
which is a single int
object, you need to pass some iterable object that would allow multiple args, even when you only want to pass one arg.
args=[threadnum]
would work, because that makes a list
which is iterable.
Solution 2
There is another solution: add a comma at the end of "threadnum"
t=threading.Thread(target=ParallelRegression,args=(threadnum,))
Related videos on Youtube
Catherine Zhang
Updated on July 09, 2022Comments
-
Catherine Zhang almost 2 years
I'm trying to calculate rolling r-squared of regression among first column and other columns in a dataframe (first column and second, first column and third etc.) But when I try threading, it kept telling me the error that
TypeError: ParallelRegression() argument after * must be an iterable, not int".
I'm wondering how do I fix this? Thanks very much!
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()
See a summary of the data (df) in the picture linked below:
-
Kevin about 6 years
args=(threadnum)
looks like it might be a typo. Is args supposed to be a tuple? One-element tuples need a trailing comma:args=(threadnum,)
-
-
Aran-Fey about 6 yearsWhy answer something that could be considered a typo, and has been asked and answered countless times already? This duplicate was literally my first google result and took a whopping 5 seconds to find.
-
Kevin about 6 yearsChanging
args
to a list works on my machine, and I'd expect it to work on most Python distributions/environments, but I think it's an implementation detail that shouldn't be depended on. The docs forThread
only say that args is "the argument tuple for the target invocation". If you give it anything other than a tuple, let the buyer beware. -
nosklo about 6 years@Aran-Fey why not? Is it frowned upon to answer questiosn?
-
Aran-Fey about 6 yearsIt is frowned upon to answer obvious duplicates, yes. If you need to know why: Because it's better if we have all the answers in a single place.
-
Aran-Fey about 6 yearsPlease see How should duplicate questions be handled?