我需要在两个步骤中使用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变量并在两个线程中更新/使用它的方法是什么。
答案 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}}发出信号已完成的信号。