代码之家  ›  专栏  ›  技术社区  ›  dildeolupbiten

python/threading/barrier:这是barrier的正确用法吗?

  •  2
  • dildeolupbiten  · 技术社区  · 6 年前

    也许我还不理解线程的屏障概念。但是我写了一个代码,我想知道它是否是屏障的正确用法。

    代码如下:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import time
    import random
    import threading
    
    
    def f(b):
        time.sleep(random.randint(2, 10))
        print("{} passed the barrier at: {}".format(threading.current_thread().getName(), time.ctime()))
        b.wait()
    
    
    barrier = threading.Barrier(3)
    for i in range(3):
        t = threading.Thread(target=f, args=(barrier,))
        t.start()
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   tdelaney    6 年前

    该屏障设置一个线程计数,这些线程将一起等待,直到达到该计数为止。在测试中有一点变化

    import time
    import random
    import threading
    
    def f(b):
        time.sleep(random.randint(2, 10))
        print("{} woke at: {}".format(threading.current_thread().getName(), time.ctime()))
        b.wait()
        print("{} passed the barrier at: {}".format(threading.current_thread().getName(), time.ctime()))
    
    barrier = threading.Barrier(3)
    for i in range(3):
        t = threading.Thread(target=f, args=(barrier,))
        t.start()
    

    您可以看到所有线程在不同的时间从睡眠中唤醒,但从 wait 同时。

    $ python3 o.py
    Thread-2 woke at: Sun May 20 11:59:16 2018
    Thread-3 woke at: Sun May 20 11:59:21 2018
    Thread-1 woke at: Sun May 20 11:59:22 2018
    Thread-1 passed the barrier at: Sun May 20 11:59:22 2018
    Thread-2 passed the barrier at: Sun May 20 11:59:22 2018
    Thread-3 passed the barrier at: Sun May 20 11:59:22 2018