多进程:类型错误:'int'对象不可迭代

11

我正在使用 Python 3 中的 multiprocessing 模块,但出现问题时,当我运行程序时它一直抛出 TypeError: 'int' object is not iterable。这是我所做的:

def main(i):
    global urlDepth
    global row
    global counter
    urlDepth = []
    row = 0
    counter = 0
    login(i)
    crawler(MENU_URL)


if __name__ == '__main__':
    workers = 2
    processes = []
    for p_number in range(workers):
        p = Process(target=main, args=p_number)
        p.start()
        processes.append(p)

    for p in processes:
        p.join()

我不明白为什么会发生这种情况,有人能帮我吗?

这不是TypeError: 'int' object is not iterable的重复,因为虽然是同样的错误,但原因不同,请在尝试将此问题标记为重复之前阅读问题/代码。


可能是重复的问题:TypeError: 'int' object is not iterable - user177800
错误出现在哪一行? - isosceleswheel
它发生在 p = Process(target=main, args=p_number),但是 @Kevin 已经解决了它。 - silverAndroid
2个回答

28
p = Process(target=main, args=p_number)

args需要是一个元组,但你给了一个整数。尝试使用:

p = Process(target=main, args=(p_number,))

谢谢,这对我也起作用了。不过,我想知道,在单独的for循环中使用p.join()是否有特定的原因?如果我在同一个循环中使用它和p、p.start(),会有什么影响吗? - Igor Markovic
@IgorMarkovic 是的,你需要两个循环,因为你希望在尝试加入任何一个线程之前启动所有线程。如果你在同一个循环中启动()和join(),那么它将启动线程1,然后等待它完全完成,然后启动线程2,等待它完全完成,以此类推。这在很大程度上破坏了使用线程的目的。 - Kevin

0
这个错误还可能在使用多进程池时发生,如果参数列表是一个元组,但不是一个列表。
from multiprocessing.pool import Pool

def func(anint,adict,u=None):
    return adict

pool = Pool(processes=2)
dictionary = {'bread':'butter', 'pb':'j', 'lamb':'stew'}
argstuple = (1,dictionary) # ;int' is not iterable
argslist = [1,dictionary] # 'int' is not iterable
argstuplist = [argstuple] # works
async_workers = [pool.starmap_async(func,argstuple) for i in range(2)] + \
        [pool.starmap_async(func, argslist) for i in range(2)] + \
        [pool.starmap_async(func, argstuplist) for i in range(2)]
pool.close()
pool.join()
for i in async_workers:
    print('dict = {}'.format(i._value))
    

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