我目前正在编写一个使用多个线程的程序。为了能够跨这些线程共享数据,我使用了像threading.Lock之类的锁,以避免在运行期间出现访问问题。
但我遇到的问题是我必须为每个数据创建大量的锁,只是为了读取数据。即使我“分组”数据并使用相同的锁,也会有太多的数据。
所以我问自己:如果一个线程只是读取数据并且没有改变它(这也适用于所有其他线程),是否会出现任何问题?
提前致谢,
答案 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个锁定线程减少到只有一个