赋值前引用的局部变量,使用多线程



在列表中添加和删除值的代码是在不同的线程中执行的操作。

在多线程中使用全局变量

from threading import Thread
import time
a=[]
i = 0
j = 0

function for thread1:

def val_in():
    while 1:
        a.append(raw_input())
        print "%s value at %d: %d added" % ( time.ctime(time.time()), i ,int(a[i])) // line 14
        i+=1

线程2的函数:

def val_out():
    while 1:
        time.sleep(5)
        try:
            print "%s value at %d: %d deleted" % (time.ctime(time.time()), j, int(a.pop(j)))
            i-=1
        except:
            print"no values lefts"
        time.sleep(2)

定义和启动线程:

t = Thread(target = val_in)
t1 = Thread(target= val_out)
t.start()
t1.start()

现在当输入为1时,它应该被添加到a列表中,但是有一个错误:

Error: Exception in thread Thread-1:
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in __bootstrap_inner
   self.run()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in run
   self.__target(*self.__args, **self.__kwargs)
  File "/Users/dhiraj.agarwal/Documents/workspace/try3/multithread.py", line 14, in val_in
UnboundLocalError: local variable 'i' referenced before assignment

你应该告诉python i是全局的:

def val_in():
    global i
    ...
def val_out():
    global i
    ...

这是变量作用域的问题。您可以在线程中为不同的方法使用局部变量。如果是这种情况,那么你必须将变量设为全局。

def val_in():
    global i  # add this line
    while 1:
        a.append(raw_input())
        print "%s value at %d: %d added" % ( time.ctime(time.time()), i ,int(a[i]))
        i+=1
def val_out():
    global i  # add this line
    while 1:
        time.sleep(5)
        try:
            print "%s value at %d: %d deleted" % (time.ctime(time.time()), j, int(a.pop(j)))
            i-=1
        except:
            print"no values lefts"
        time.sleep(2)

相关内容

  • 没有找到相关文章

最新更新