温馨提示×

python wait有哪些技巧

小樊
81
2024-11-19 19:37:58
栏目: 编程语言

在Python中,等待(wait)通常与线程(threading)模块一起使用。以下是一些关于Python线程等待的技巧:

  1. 使用threading.Eventthreading.Event对象可以用于线程间的简单信号通知。它有一个set()方法用于发出信号,一个is_set()方法用于检查信号是否已发出,以及一个wait()方法用于阻塞线程直到信号被发出。

    import threading
    
    event = threading.Event()
    
    def worker():
        print("Worker thread started")
        event.wait()  # 阻塞线程直到事件被设置
        print("Worker thread finished")
    
    thread = threading.Thread(target=worker)
    thread.start()
    event.set()  # 发出信号,唤醒等待的线程
    thread.join()
    
  2. 使用threading.Conditionthreading.Condition对象允许一个或多个线程等待某个条件成立。它提供了wait()方法用于阻塞线程直到条件被满足,以及notify()notify_all()方法用于唤醒等待的线程。

    import threading
    
    condition = threading.Condition()
    data = []
    
    def worker():
        with condition:
            print("Worker thread started")
            while not data:  # 如果数据为空,则等待
                condition.wait()
            print(f"Worker thread processed {data[0]}")
            data.pop(0)
            condition.notify_all()  # 唤醒所有等待的线程
    
    threads = [threading.Thread(target=worker) for _ in range(5)]
    for thread in threads:
        thread.start()
    
    for item in range(5):
        with condition:
            data.append(item)
            condition.notify_all()  # 唤醒所有等待的线程
    
    for thread in threads:
        thread.join()
    
  3. 使用threading.Semaphorethreading.Semaphore对象用于限制同时访问共享资源的线程数量。它提供了acquire()release()方法,分别用于尝试获取信号量和释放信号量。当信号量的计数器为零时,线程将被阻塞直到其他线程释放信号量。

    import threading
    
    semaphore = threading.Semaphore(3)  # 最多允许3个线程同时访问
    
    def worker(thread_id):
        with semaphore:
            print(f"Worker thread {thread_id} started")
            print(f"Worker thread {thread_id} finished")
    
    threads = [threading.Thread(target=worker, args=(i,)) for i in range(10)]
    for thread in threads:
        thread.start()
    
    for thread in threads:
        thread.join()
    
  4. 使用threading.Lockthreading.Lock对象用于确保同一时间只有一个线程可以访问共享资源。它提供了acquire()release()方法,分别用于尝试获取锁和释放锁。当锁被其他线程持有时,线程将被阻塞直到锁被释放。

    import threading
    
    lock = threading.Lock()
    shared_resource = 0
    
    def worker(thread_id):
        global shared_resource
        with lock:
            print(f"Worker thread {thread_id} started")
            shared_resource += 1
            print(f"Worker thread {thread_id} finished, shared_resource = {shared_resource}")
    
    threads = [threading.Thread(target=worker, args=(i,)) for i in range(10)]
    for thread in threads:
        thread.start()
    
    for thread in threads:
        thread.join()
    

这些技巧可以帮助您更有效地使用Python的线程等待功能。在实际应用中,您可能需要根据具体需求选择合适的同步原语(如EventConditionSemaphoreLock)。

0