本記事ではPythonのthreadingに用意されているbarrierをメモ程度にまとめています。Pythonは非常に人気なプログラミング言語です。そんなPythonでのbarrierの使い方が参考になれば幸いです。
本記事の目標
Barrierは指定した数のスレッドがバリアを通過すると、まとめて実行されます。
オンラインゲームなどで人数が揃ってからゲームを始める場合や、サーバーとクライアントで同時に接続がされていなければいけない場合などに利用されます。
ちなみに、本記事の実行環境は「python 3.8.8」です。
Pythonコード1
簡単なじゃんけんゲームを想定してBarrierでコードを組んでみました。
import threading
import time
def start_game():
print('{}人揃いました。じゃんけん可能。'.format(num))
def Player(name, barrier):
try:
if not barrier.broken:
print('{}が参加'.format(name))
barrier.wait(2)
except threading.BrokenBarrierError:
print('人数不足で{}が退出'.format(name))
if __name__ == '__main__':
num = 2
barrier = threading.Barrier(num, action=start_game)
players = []
for i in range(11):
p = threading.Thread(target=Player, args=(str(i), barrier))
players.append(p)
time.sleep(0.5)
for p in players:
p.start()
【実行結果】
0が参加
1が参加
2人揃いました。じゃんけん可能。
2が参加
3が参加
2人揃いました。じゃんけん可能。
4が参加
5が参加
2人揃いました。じゃんけん可能。
6が参加
7が参加
2人揃いました。じゃんけん可能。
8が参加
9が参加
2人揃いました。じゃんけん可能。
10が参加
人数不足で10が退出
実行結果から2つの数のスレッドがBariierを通過した場合に処理がまとめて行われていることが分かります。
Pythonコード2
無限ループになる処理ですが、
process1とprocess2をクライアントとサーバーに見立ててイメージすると、実用性が見えてくるかと思います。
import threading
import time
def process1(barrier):
barrier.wait()
while True:
print('ー処理1が開始')
time.sleep(2)
print('ー処理1が終了')
def process2(barrier):
barrier.wait()
while True:
print('ー処理2が開始')
time.sleep(2)
print('ー処理2が終了')
if __name__ == '__main__':
barrier = threading.Barrier(2)
# スレッドを行うインスタンスの作成
p1 = threading.Thread(target=process1, args=(barrier,))
p2 = threading.Thread(target=process2, args=(barrier,))
p1.start()
p2.start()
【実行結果】
(無限ループが行われます。)
詳しthreading.Bariierの使い方は公式リファレンからどうぞ。
ということで本記事はPythonのBarrierを用いたスレッド制御方法を紹介しました。
最後まで読んでいただきありがとうございました\(^o^)/
超オススメのPC用品
PCを操作する上で、トラックボールマウスが非常におすすめです!
僕も感動したこのマウスを、騙されたと思って使ってみてください!(^^)
リンク
外部モニターで2倍以上の効率化が見込めます!
安いものだと、たったの1万円前後なのでおすすめですよー!\(^o^)/
リンク