用几个线程写入列表并用另一个读取它 - Python

时间:2014-11-13 21:57:29

标签: python multithreading

嗨,我遇到了多线程问题。 我想要做的是获取一些带有http请求的数据。目前我想从3个网络服务器获取数据。我在python中使用了线程模块。

我现在要做的是将数据写入数组并对其进行排序。

Thread0 writes data to array[0]
Thread1 writes data to array[1]
Thread2 writes data to array[2]

仅当从Web服务器获取的数据发生更改时才会发生这种情况。 thread4应该在更改后复制该数组并对其进行排序,然后对副本进行一些处理。

这是我的计划。如何在不阻止其他线程的写操作的情况下执行此操作,以及如何在读取数据时确保数据不会出现不一致。

这是我对这个想法的了解。

这是一个线程的模块:

import threading

class http_fetcher(threading.Thread):
     _idx_of_list = []

     def set_idx(self,idx)
         self._idx_of_list = idx

     def run(self)
         global my_list

         #some http fetching stuff

         old_data = []

         if old_data != actual_data:
             old_data = actual_data
             my_list[self._idx_of_list] = actual_data

这是调用主程序

if __name__ == "__main__":
    my_list = []
    thread1 = http_fetcher()
    thread1.set_idx(1)
    thread1.start()

    thread2 = http_fetcher()
    thread2.set_idx(2)
    thread2.start()

    thread3 = http_fetcher()
    thread3.set_idx(3)
    thread3.start()

到目前为止,我还没有在阅读网站上工作过。 你怎么看? 写入列表的不同索引应该是线程安全的还是我错了? 但是,如何通知另一个线程列表值已更改? 目前我收到一个错误 “NameError:全局名称'my_list'未定义” 为什么?

我希望你们中的一些人可以提供帮助并找到这个有趣的

此致

2 个答案:

答案 0 :(得分:0)

https://docs.python.org/2/library/queue.html#module-Queue

您可以使用队列模块在多个线程之间安全地交换信息。 模块描述结束时有一个很好的例子。

答案 1 :(得分:0)

好的我终于尝试了队列,经过一些调整后它确实有效