Python多线程编程中如何正确使用多线程?
我遇到一个问题 就是 我想写一个死循环
while True:
write(timeframe="1m")
write(timeframe="5m")
write(timeframe="1h")
write(timeframe="1d")
如何能够实现
第一个 write 方法执行后休眠 60s
第二个 write 方法执行后休眠 5min
第三个 write 方法执行后休眠 1h
第四个 write 方法执行后休眠 1d
Python多线程编程中如何正确使用多线程?
这个很简单啊,用 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()
关键要点:
- 创建线程:直接实例化
Thread类或继承它 - 线程同步:使用
Lock/RLock防止竞态条件 - 线程通信:使用
Queue实现生产者-消费者模式 - 线程管理:用
join()等待线程结束,或用ThreadPoolExecutor管理线程池 - 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
定时任务? 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


