Python多线程并发中数据延迟问题如何解决?

目前计算数据量比较大的时候
python 数据延迟

python 3.6.5
制作的 py 多线程脚本,服务器传递的数据实时的,但是脚本延迟到几个小时。
单脚本会好一点

我看 pypy 和 cpython,但是目前还误解,有高手吗?
Python多线程并发中数据延迟问题如何解决?

2 回复

在多线程里遇到数据延迟,通常是因为线程间共享数据没做好同步。Python的threading模块提供了LockRLockCondition这些同步原语,用它们能保证同一时间只有一个线程操作共享数据。

最常见的就是用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()就行,比自己写锁简单不少。

简单说就是:共享数据要加锁,或者直接用线程安全的容器。


关键步骤打日志(时间),看下哪里慢了?

回到顶部