更新两个线程之间的全局变量

时间:2015-01-19 20:03:14

标签: python multithreading asynchronous

我需要在两个步骤中使用tweepy提取信息并在第一次迭代时更新全局变量location(在我的代码中检查PART1);然后做一些数据操作以返回位置列表(或更新它),然后应用第二部分,我从twitter(PART2)中提取数据。

这是我的代码:

locations=[[-6.38,49.87,1.77,55.81], [-3.38,39.87,1.77,55.81]]

def Part1():
# Doing something here to get locations, then update the location variable 

def Part2():
    for l in locations:
        # then I need to delete the location (l) from the gloabl list 

t1 = Thread(target = Part1)
t2 = Thread(target = Part2)

def main():
    t1.start()
    t2.start()

这是最好的方法吗?建议将location作为gloabl变量并在两个线程中更新/使用它的方法是什么。

1 个答案:

答案 0 :(得分:1)

此处有两个问题,首先您应该使用locations代替for ... in ...而不是列表。 Queue可以帮助解释为什么在线程环境中首选队列。

其次,正如Paulo在评论中提到的那样,在修改列表时使用import threading import queue # Queue in python2.x def Part1(locations): # Do work to get locations locations.put(location) def Part2(locations): # setup API while True: try: # Get a location and do something with it location = locations.get() ... except queue.Empty: # No items in locations, quit break def main(): # setup queue and initial values locations = queue.Queue() locations.put([-6.38,49.87,1.77,55.81]) # start the threads t1 = threading.Thread(target=Part1, args=(locations,)) t2 = threading.Thread(target=Part2, args=(locations,)) t1.start() t2.start() 构造是一个坏主意。创建的迭代器将不知道列表的更改,因此它可能会多次返回相同的元素或跳过项目,具体取决于您修改列表的方式。因此,我们不使用列表上的迭代器,而是使用while循环和弹出项。

您的示例可能看起来像这样

Part1

请注意,正如所写的那样,此示例假定Part2生成的位置比Part2生成的位置更快。如果位置变空,即使Part1稍后添加更多对象,Part1也会退出。如果情况并非如此,则您必须将break语句更改为休眠状态,并为Part2添加某种方式以向{{1}}发出信号已完成的信号。