不编辑python中的全局变量

时间:2014-05-13 09:22:09

标签: python multithreading parallel-processing global

我编写了以下代码(简化),将对象添加到最初为空的列表(listOfElements,这是一个全局变量)。然而,当我最后打印这个列表时,它仍然是空的。我做错了什么?

import threading
def addElement(listOfElements):
   for k in range(10):
      listOfElements.append(k)



listOfElements = []

import threading
def addElement(listOfElements,otherList):
   for k in range(10):
      listOfElements.append(k)



listOfElements = []
threadsElts = []
for i in range(10):
    threadsElts.append(threading.Thread(target=addElement,args=(listOfElements,otherList)))
for t in threadsElts:
    t.start()
for t in threadsElts:
    t.join()

threadsElts = []
for i in range(10):
    threadsElts.append(threading.Thread(target=addElement,args=(listOfElements,otherList)))
for t in threadsElts:
    t.start()
for t in threadsElts:
    t.join()

2 个答案:

答案 0 :(得分:2)

问题在于代码。使用您的代码,我收到此错误: -

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/local/akamai/lib/python2.7/threading.py", line 551, in __bootstrap_inner
  File "/usr/local/akamai/lib/python2.7/threading.py", line 504, in run
TypeError: addElement() takes exactly 1 argument (0 given)

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/local/akamai/lib/python2.7/threading.py", line 551, in __bootstrap_inner
  File "/usr/local/akamai/lib/python2.7/threading.py", line 504, in run
TypeError: addElement() takes exactly 1 argument (0 given)

Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/local/akamai/lib/python2.7/threading.py", line 551, in __bootstrap_inner
  File "/usr/local/akamai/lib/python2.7/threading.py", line 504, in run
TypeError: addElement() takes exactly 1 argument (0 given)

Exception in thread Thread-4:
Traceback (most recent call last):
  File "/usr/local/akamai/lib/python2.7/threading.py", line 551, in __bootstrap_inner
  File "/usr/local/akamai/lib/python2.7/threading.py", line 504, in run
TypeError: addElement() takes exactly 1 argument (0 given)

Exception in thread Thread-5:
Traceback (most recent call last):
  File "/usr/local/akamai/lib/python2.7/threading.py", line 551, in __bootstrap_inner
  File "/usr/local/akamai/lib/python2.7/threading.py", line 504, in run
TypeError: addElement() takes exactly 1 argument (0 given)

Exception in thread Thread-6:
Traceback (most recent call last):
  File "/usr/local/akamai/lib/python2.7/threading.py", line 551, in __bootstrap_inner
  File "/usr/local/akamai/lib/python2.7/threading.py", line 504, in run
TypeError: addElement() takes exactly 1 argument (0 given)

Exception in thread Thread-7:
Traceback (most recent call last):
  File "/usr/local/akamai/lib/python2.7/threading.py", line 551, in __bootstrap_inner
  File "/usr/local/akamai/lib/python2.7/threading.py", line 504, in run
TypeError: addElement() takes exactly 1 argument (0 given)

Exception in thread Thread-8:
Traceback (most recent call last):
  File "/usr/local/akamai/lib/python2.7/threading.py", line 551, in __bootstrap_inner
  File "/usr/local/akamai/lib/python2.7/threading.py", line 504, in run
TypeError: addElement() takes exactly 1 argument (0 given)

Exception in thread Thread-9:
Traceback (most recent call last):
  File "/usr/local/akamai/lib/python2.7/threading.py", line 551, in __bootstrap_inner
  File "/usr/local/akamai/lib/python2.7/threading.py", line 504, in run
TypeError: addElement() takes exactly 1 argument (0 given)

Exception in thread Thread-10:
Traceback (most recent call last):
  File "/usr/local/akamai/lib/python2.7/threading.py", line 551, in __bootstrap_inner
  File "/usr/local/akamai/lib/python2.7/threading.py", line 504, in run
TypeError: addElement() takes exactly 1 argument (0 given)

如果你像这样传递listOfElements,可以解决这个问题: -

threadsElts.append(threading.Thread(target=addElement,args=(listOfElements,)))

进行上述更改后代码运行正常。

另外,请记住,您正在修改变量而不进行任何锁定,因此您的代码可能会损坏您的数据。您可能需要浏览此链接:http://effbot.org/zone/thread-synchronization.htm以便更好地了解问题

答案 1 :(得分:1)

您的问题很简单,TypeError: addElement() takes exactly 1 argument (0 given)

它告诉我们你的问题是函数的参数,而你的参数是在线程args=(listOfElements)中给出的,它看起来不错,但语法错误。

在python中,元组很特殊,看看这个:

a = () # a has no element
a = (1) # error
a = (1,) # yes, a has one element, the dot cannot be missing, special
a = (1,2) # yes, a has two

你可以尝试一下。