Python キューとスレッド

スポンサーリンク

キューとスレッドを解説しますが、このページでPythonの技術情報というよりは、投資など実際の運用に使えるようにしたいと思います。

ですので、本来は多くの機能がありますが省いて簡素にしています

ここでは最終的にキューとスレッドを組み合わせて、並行処理をストレスなくできるようにしたいです。

スポンサーリンク

キュー

キューは簡単に言えば、処理の箱のようなもので、その箱にデータなどが溜まっていきます。それを順番に取り出します。取り出し方は、先入れ後出しや先入れ先出しなどがありますが、ここでは先入れ先出しを紹介します。

queueという標準ライブラリを使用します。標準ですのでインストールは不要です。

以下の3種類の関数ありますが、ここではQueueのみをインポートします。

  • Queue:先入れ先出し
  • LifoQueue:先入れ後出し
  • PriorityQueue:優先順位付き
from queue import Queue
aaa = Queue() # aaaというキューを作成します。
for i in range(1,5):
aaa.put(i) # aaaというキューにデータを蓄積します。
while not aaa.empty(): # aaaというキューのデータがなくなるまでループします。
print(aaa.get()) # aaaというキューからデータを取り出します。
# 1
# 2
# 3
# 4
from queue import Queue aaa = Queue() # aaaというキューを作成します。 for i in range(1,5): aaa.put(i) # aaaというキューにデータを蓄積します。 while not aaa.empty(): # aaaというキューのデータがなくなるまでループします。 print(aaa.get()) # aaaというキューからデータを取り出します。 # 1 # 2 # 3 # 4
from queue import Queue

aaa = Queue() # aaaというキューを作成します。

for i in range(1,5):
    aaa.put(i) # aaaというキューにデータを蓄積します。

while not aaa.empty(): # aaaというキューのデータがなくなるまでループします。
    print(aaa.get()) # aaaというキューからデータを取り出します。

# 1
# 2
# 3
# 4

スレッド

スレッドはそのままですが、並列処理ですね。

例えば、ルーティン処理でデータを取得・分析をしていて、ある条件が整った時に、ルーティンが止まらないよう、別の処理を並行して走らせるという感じでしょうか。

投資の世界では1秒もロスが許されない!?そんなシビアなシステムを作りたいものですね。。。

threadingという標準ライブラリを使用します。標準ですのでインストールは不要です。

import threading
import time
def bbb():
for i in range(1,5):
print("thread" + str(i))
time.sleep(0.5)
if __name__ == '__main__':
thread = threading.Thread(target=bbb) # bbbという関数を処理するthreadというスレッドを作成します。
thread.start() # スレッドスタートさせます
print("start")
for i in range(1,5):
print(i)
time.sleep(1)
# thread1start
# 1
# thread2
# 2thread3
# thread4
# 3
# 4
import threading import time def bbb(): for i in range(1,5): print("thread" + str(i)) time.sleep(0.5) if __name__ == '__main__': thread = threading.Thread(target=bbb) # bbbという関数を処理するthreadというスレッドを作成します。 thread.start() # スレッドスタートさせます print("start") for i in range(1,5): print(i) time.sleep(1) # thread1start # 1 # thread2 # 2thread3 # thread4 # 3 # 4
import threading
import time

def bbb():
    for i in range(1,5):
        print("thread" + str(i))
        time.sleep(0.5)

if __name__ == '__main__':
    thread = threading.Thread(target=bbb) # bbbという関数を処理するthreadというスレッドを作成します。

    thread.start() # スレッドスタートさせます

    print("start")

    for i in range(1,5):
        print(i)
        time.sleep(1)

# thread1start

# 1
# thread2
# 2thread3

# thread4
# 3
# 4

多少、結果がわかりにくいですが、並列処理しているのをご理解頂けると思います。

スレッドの終了(強制終了)

thread.setDaemon(True)とすると、本体のシステムでsys.exit()Ctrl+Cが実行されると、スレッドを強制終了します。ただし、Jupyter Notebookではsys.exit()が使用できませんので注意してください。

import sys
import threading
import time
def bbb():
while True:
print("thread")
time.sleep(1)
thread = threading.Thread(target=bbb) # bbbという関数を処理するthreadというスレッドを作成します。
thread.setDaemon(True) # システムが終了すると強制的にスレッドを停止します。
thread.start() # スレッドスタートさせます
time.sleep(3)
sys.exit()
import sys import threading import time def bbb(): while True: print("thread") time.sleep(1) thread = threading.Thread(target=bbb) # bbbという関数を処理するthreadというスレッドを作成します。 thread.setDaemon(True) # システムが終了すると強制的にスレッドを停止します。 thread.start() # スレッドスタートさせます time.sleep(3) sys.exit()
import sys
import threading
import time
def bbb():
    while True:
        print("thread")
        time.sleep(1)
        

thread = threading.Thread(target=bbb) # bbbという関数を処理するthreadというスレッドを作成します。
thread.setDaemon(True) # システムが終了すると強制的にスレッドを停止します。
thread.start() # スレッドスタートさせます

time.sleep(3)

sys.exit()

キューとスレッドで並列処理

これが本番です。キューとスレッドを組み合わせて並列処理を滞りなく処理ができます。

投資では、これを実現できれば、発注の遅延によるロスを減らせると思います。

ポイントは、関数bbbwhile = Trueです。while not aaa.empty()とすると、キューがなくなった場合に関数bbbが終わってしまいます。while = Trueとして、スレッドを常に動作させてキューに溜まれば処理をするという風にしています。

from queue import Queue
import threading
import time
def bbb(aaa):
while True:
print("thread" + aaa.get())
if __name__ == '__main__':
aaa = Queue()
thread = threading.Thread(target=bbb, args=(aaa,))
thread.start()
print("start")
for i in range(1,5):
for j in range(1,5):
s = str(i)+"-"+str(j)
if j == 1:
aaa.put(s)
else:
print(s)
time.sleep(0.1)
# start
# 1-2thread1-1
# 1-3
# 1-4
# 2-2thread2-1
# 2-3
# 2-4
# 3-2thread3-1
# 3-3
# 3-4
# 4-2thread4-1
# 4-3
# 4-4
from queue import Queue import threading import time def bbb(aaa): while True: print("thread" + aaa.get()) if __name__ == '__main__': aaa = Queue() thread = threading.Thread(target=bbb, args=(aaa,)) thread.start() print("start") for i in range(1,5): for j in range(1,5): s = str(i)+"-"+str(j) if j == 1: aaa.put(s) else: print(s) time.sleep(0.1) # start # 1-2thread1-1 # 1-3 # 1-4 # 2-2thread2-1 # 2-3 # 2-4 # 3-2thread3-1 # 3-3 # 3-4 # 4-2thread4-1 # 4-3 # 4-4
from queue import Queue
import threading
import time


def bbb(aaa):
    while True:
        print("thread" + aaa.get())

        
if __name__ == '__main__':
    aaa = Queue()

    thread = threading.Thread(target=bbb, args=(aaa,))
    thread.start()

    print("start")

    for i in range(1,5):
        for j in range(1,5):
            s = str(i)+"-"+str(j)
            
            if j == 1:
                aaa.put(s)
            else:
                print(s)

        time.sleep(0.1)

# start
# 1-2thread1-1
# 1-3

# 1-4
# 2-2thread2-1

# 2-3
# 2-4
# 3-2thread3-1

# 3-3
# 3-4
# 4-2thread4-1
# 4-3
# 4-4

 

タイトルとURLをコピーしました