Python多线程编程中如何正确使用多线程?

我遇到一个问题 就是 我想写一个死循环

while True:
    write(timeframe="1m")
    write(timeframe="5m")
    write(timeframe="1h")
    write(timeframe="1d")

如何能够实现
第一个 write 方法执行后休眠 60s 第二个 write 方法执行后休眠 5min 第三个 write 方法执行后休眠 1h 第四个 write 方法执行后休眠 1d


Python多线程编程中如何正确使用多线程?

20 回复

这个很简单啊,用 time.sleep() 就可以。


import threading
import time
from queue import Queue

# 1. 基础线程创建
def worker_basic(num):
    print(f"线程 {num} 开始执行")
    time.sleep(1)
    print(f"线程 {num} 执行完成")

# 2. 使用锁确保线程安全
counter = 0
lock = threading.Lock()

def worker_with_lock():
    global counter
    with lock:  # 自动获取和释放锁
        temp = counter
        time.sleep(0.001)  # 模拟耗时操作
        counter = temp + 1

# 3. 使用队列进行线程间通信
def producer(q, items):
    for item in items:
        print(f"生产: {item}")
        q.put(item)
        time.sleep(0.1)

def consumer(q):
    while True:
        item = q.get()
        if item is None:  # 终止信号
            break
        print(f"消费: {item}")
        q.task_done()

# 4. 线程池示例(使用concurrent.futures)
from concurrent.futures import ThreadPoolExecutor

def task(n):
    return n * n

def main():
    print("=== 基础线程示例 ===")
    threads = []
    for i in range(3):
        t = threading.Thread(target=worker_basic, args=(i,))
        threads.append(t)
        t.start()
    
    for t in threads:
        t.join()
    
    print("\n=== 线程安全示例 ===")
    threads = []
    for _ in range(100):
        t = threading.Thread(target=worker_with_lock)
        threads.append(t)
        t.start()
    
    for t in threads:
        t.join()
    print(f"最终计数器值: {counter}")
    
    print("\n=== 生产者-消费者示例 ===")
    q = Queue()
    producer_thread = threading.Thread(target=producer, args=(q, [1, 2, 3, 4, 5]))
    consumer_thread = threading.Thread(target=consumer, args=(q,))
    
    producer_thread.start()
    consumer_thread.start()
    
    producer_thread.join()
    q.put(None)  # 发送终止信号
    consumer_thread.join()
    
    print("\n=== 线程池示例 ===")
    with ThreadPoolExecutor(max_workers=3) as executor:
        futures = [executor.submit(task, i) for i in range(5)]
        results = [f.result() for f in futures]
        print(f"计算结果: {results}")

if __name__ == "__main__":
    main()

关键要点:

  1. 创建线程:直接实例化Thread类或继承它
  2. 线程同步:使用Lock/RLock防止竞态条件
  3. 线程通信:使用Queue实现生产者-消费者模式
  4. 线程管理:用join()等待线程结束,或用ThreadPoolExecutor管理线程池
  5. GIL限制:CPU密集型任务考虑多进程(multiprocessing

注意:Python的GIL使得多线程主要适用于I/O密集型任务,CPU密集型任务建议用多进程。

总结:根据任务类型选择合适的并发方式。

time.sleep() ?

我觉得你需要 crontab …

time.sleep()的话 比如最后一个 睡一小时 那么第一个需要等待一小时才能执行,而我想让他每分钟执行

python<br>#coding=utf-8<br><br>import concurrent.futures as futures<br># from concurrent.futures import ThreadPoolExecutor<br>import time<br><br><br>def write(delay):<br> print('sleep:',delay)<br> time.sleep(delay)<br> return 'result'<br><br><br>def main():<br> with futures.ThreadPoolExecutor(max_workers=4) as executor:<br> download_futures = [executor.submit(write, delay) for delay in [60,5*60,60*60,24*60*60]]<br> for future in futures.as_completed(download_futures):<br> rs = future.result()<br> print(rs)<br> print('all done.')<br><br>if __name__ == '__main__':<br> main()<br>

time.sleep() ,crontab 里每分钟叫这个 .py 起来一次,每次即一个新 py 进程。

当然,为了防止内存耗尽,你的 .py 或许要增加首先检测系统里有几个同名 .py 进程在跑,
假若超过你的限制,那么就直接 sys.exit()

补充 6 楼,如何使用 Shell 命令判断一个进程是否存在: https://mp.weixin.qq.com/s/b9RxTGGrUpUG1NgZoqE1uA

要定时任务吧,用 apscheduler 吧。照你这样写很麻烦啊。

每秒钟取 timestamp 再去 mod timeframe 判断一下不行吗

我觉得你应该用 Timer 定时任务来做,而不是简单的 sleep,因为长时间的 sleep 误差挺大的,有可能一直挂起不恢复了。

asyncio 了解一下,轻量级解决方案

另外 sleep 最好不要超过 h

Timer?

定时任务? schedule 模块

schedule,给人类用的定时器模块。
# 每十分钟执行一次
schedule.every(10).minutes.do(job)

# 每 1 小时执行一次
schedule.every().hour.do(job)

# 每天执行一次
schedule.every(). day.do(job)

while True:
schedule.run_pending()
time.sleep(1)

python 多线程有点尴尬,golang 了解一下!

我倒是想知道 多线程或者多进程 最后一句是不是总是 while true + time.sleep
? 死循环等介绍

为什么说尴尬?

为了避免著名的 X-Y 问题,我想问一下这个 use case 是什么呢?为什么需要 wait 呢?
如果轻量级可以用 cronjob,大型项目可以考虑 apache airflow

回到顶部