Python多线程并发中数据延迟问题如何解决?
目前计算数据量比较大的时候
python 数据延迟
python 3.6.5
制作的 py 多线程脚本,服务器传递的数据实时的,但是脚本延迟到几个小时。
单脚本会好一点
我看 pypy 和 cpython,但是目前还误解,有高手吗?
Python多线程并发中数据延迟问题如何解决?
2 回复
在多线程里遇到数据延迟,通常是因为线程间共享数据没做好同步。Python的threading模块提供了Lock、RLock、Condition这些同步原语,用它们能保证同一时间只有一个线程操作共享数据。
最常见的就是用Lock。比如多个线程要改同一个计数器:
import threading
class Counter:
def __init__(self):
self.value = 0
self.lock = threading.Lock()
def increment(self):
with self.lock:
self.value += 1
counter = Counter()
threads = []
for _ in range(1000):
t = threading.Thread(target=counter.increment)
threads.append(t)
t.start()
for t in threads:
t.join()
print(counter.value) # 保证是1000
这里with self.lock:确保了increment()操作是原子的。不用锁的话,self.value += 1这行(先读后写)可能被其他线程打断,最后结果就不准了。
如果涉及生产者-消费者模型,可以用queue.Queue,它本身就是线程安全的:
import threading
import queue
import time
def producer(q):
for i in range(5):
time.sleep(0.1) # 模拟生产延迟
q.put(i)
print(f"Produced {i}")
def consumer(q):
while True:
item = q.get()
if item is None:
break
time.sleep(0.2) # 模拟处理延迟
print(f"Consumed {item}")
q.task_done()
q = queue.Queue()
prod = threading.Thread(target=producer, args=(q,))
cons = threading.Thread(target=consumer, args=(q,))
prod.start()
cons.start()
prod.join()
q.put(None) # 发送结束信号
cons.join()
Queue内部已经处理好了锁,用put()和get()就行,比自己写锁简单不少。
简单说就是:共享数据要加锁,或者直接用线程安全的容器。
关键步骤打日志(时间),看下哪里慢了?

