2014-05-13 3 views
0

처음에 빈 목록 (전역 변수 인 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() 
+0

들여 쓰기를 검토해주세요. 그것은 파이썬에서 중요합니다. – jonrsharpe

+0

코드가 실행되고 있습니까? 필요로하는 수입품, 다만 1 개에서 2 개의 선을조차하는 마음조차 및 그것을 다른 사람이 짐작할 수있는 일없이 빨리 검사하는 것을 돕는다. –

답변

2

문제는 코드에 있습니다. 이 같은 listOfElements을 전달하는 경우

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) 

그것은 해결할 수 있습니다 : - - :

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

코드는 위의 변경을 한 후 잘 실행 코드로, 나는이 오류가 발생합니다.

또한 잠금을 해제하지 않고 변수를 수정하면 코드가 데이터를 손상시킬 수 있습니다. 문제를 더 잘 이해하기 위해 http://effbot.org/zone/thread-synchronization.htm 링크를 통과하는 것이 좋습니다.

+0

링크를 가져 주셔서 감사합니다. 추가 작업이 스레드 안전 작업 (cf 원자 작업 단락)이라고 생각합니다. – teaLeef

+0

스레드 안전 작업이 추가 될 때까지 다음 링크를 통해 이동하십시오. http://stackoverflow.com/questions/6319207/are-lists- 스레드 안전 – GodMan

1

문제는 간단합니다. TypeError: addElement() takes exactly 1 argument (0 given).

귀하의 문제는 함수의 매개 변수이며, 귀하의 매개 변수는 스레드 args=(listOfElements)에 주어 지지만 문제는 아니라고하지만 구문 오류입니다.

파이썬에서, 튜플이 특별이 모양 :

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 

당신은 그것을 시도 할 수 있습니다.

관련 문제