从不同线程读取数据时可能出错

时间:2011-04-03 18:52:08

标签: python multithreading

我目前正在编写一个使用多个线程的程序。为了能够跨这些线程共享数据,我使用了像threading.Lock之类的锁,以避免在运行期间出现访问问题。

但我遇到的问题是我必须为每个数据创建大量的锁,只是为了读取数据。即使我“分组”数据并使用相同的锁,也会有太多的数据。

所以我问自己:如果一个线程只是读取数据并且没有改变它(这也适用于所有其他线程),是否会出现任何问题?

提前致谢,

3 个答案:

答案 0 :(得分:0)

如果所有线程都只是读取数据,那么从不同的线程同时访问数据没有问题,只要读取数据不会改变它。在某些数据结构中可能会发生更改读取数据,defaultdict是一个棘手的例子。

如果您有消费者\生产者场景,请考虑使用Queue.Queue,这是一种允许同时读写的线程安全数据结构。来自Python documentation

def worker():
    while True:
        item = q.get()
        do_work(item)
        q.task_done()

q = Queue()
for i in range(num_worker_threads):
     t = Thread(target=worker)
     t.daemon = True
     t.start()

for item in source():
    q.put(item)

q.join()       # block until all tasks are done

答案 1 :(得分:0)

假设您有50个线程。只要一个线程能够写入数据,那么任何其他读取数据的线程都会产生问题。

例如,一个线程写入数据,然后另一个线程读取该数据。如果存在并发问题,它将在更改之前或之后读取数据。你无法识别出来。

只有每个线程只读,你就不会有问题。

答案 2 :(得分:0)

我相信如果你写的话你只需要锁定就意味着如果你有20个线程只读一个写,那么你只需要在写一个工作时锁定,将21个锁定线程减少到只有一个