Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用几个线程写入列表,用另一个线程读取_Python_Multithreading - Fatal编程技术网

Python 用几个线程写入列表,用另一个线程读取

Python 用几个线程写入列表,用另一个线程读取,python,multithreading,Python,Multithreading,嗨,我有一个多线程的问题。 我试图做的是通过http请求获取一些数据。目前我想从3个Web服务器获取数据。我正在使用python中的线程模块 我现在要做的是将数据写入数组并对其进行排序 Thread0 writes data to array[0] Thread1 writes data to array[1] Thread2 writes data to array[2] 只有当从Web服务器获取的数据发生更改时,才会发生这种情况。 thread4应该在数组发生更改时复制该数组并对其进行排序

嗨,我有一个多线程的问题。 我试图做的是通过http请求获取一些数据。目前我想从3个Web服务器获取数据。我正在使用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()
到目前为止,我还没有在阅读网站上工作过。 你怎么认为? 写入列表的不同索引应该是线程安全的,还是我错了? 但是我如何向另一个线程发出列表值已更改的信号呢? 目前我得到一个错误 “名称错误:未定义全局名称‘我的列表’” 为什么

我希望你们中的一些人能提供帮助,并觉得这很有趣。

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

好的,谢谢你让我看了一下队列。就我所理解的概念而言,我正在队列末尾进行同步。但是我想要的是,我想我忘了这是一遍又一遍地运行我的3个线程(包含在“while True”中)lopp并希望访问他们正在创建的阵列而不被阻塞太长时间。队列似乎更像是一个任务列表,线程将一直工作到完成。但我不希望它们完成…没有更好的方法吗?问题是,如果一个Web服务器发送的答案比其他服务器晚很多,那么我就被阻塞了一段时间。我不要这个