Pythonでマルチスレッド再び

以前、Pythonでマルチスレッド処理を行うプログラムを書いた。そのときはthreading.ThreadとQueue.Queueを使っていた。それはPython2.7を使っていたから。
しかし、今はPython3がメインだ。concurrent.futures.ThreadPoolExecutorを使えばもっとスマートに実装できる。

Python3

from concurrent.futures import ThreadPoolExecutor

def download(name, url):
    pass

target_url_list = []  # URL List
tp = ThreadPoolExecutor(max_workers=4)
for url in target_url_list:
    tp.submit(download, url.name, url.url)
tp.shutdown()
print('End')

とても簡単に書くことができる。max_workersに応じて多重度を調整してくれる。ThreadPoolExecutorのshutdown()メソッドで、すべてのスレッドの終了を待ち合わせてくれる。
これは便利。

Python2(参考)

import threading
import Queue

def download(q):
    while True:
        item = q.get()
        if item is None:
            break
        name = item.name
        url = item.url
        pass

target_url_list = []  # URL List
q = Queue.Queue()

thread_list = []
for i in range(4):
    thread = threading.Thread(target=download, args=(q,))
    thread.start()
    thread_list.append(thread)

for item in target_url_list:
    q.put(item)

for i in range(len(thread_list)):
    q.put(None)

for thread in thread_list):
    thread.join()

print('End')

以前はこれが普通だったけれど、今見るととても冗長だ。

まとめ

もうPython2のことは忘れてPython3でどんどん作ろう。
(はやくJythonがPython3系になってくれると良いのだが・・・)

同じタグの記事
同じカテゴリの記事

Pythonでファイルの更新日時変更

メーカーの分からないフォトフレームがある。SDカードに写真を入れて、それを差し込めば表示されるのだが、並び順が全くわからない。ディレクトリも無視しているようだ。しかしよく見ると、写真を撮った順番に並んでいるようにも見える。どうやら、撮影日ではなく、ファイルの最終更新日時順で表示されているようだ。たまに順番がおかしいのは編集したファイルだ。
ファイルの更新日を希望の順番で更新してしまおう。

os.utimeで更新

import os
import datetime

target_file = 'test.jpg'
utime = datetime.datetime.strptime('20191109_080322', '%Y%m%d_%H%M%S')
os.utime(target_file, (utime.timestamp(), utime.timestamp()))

まとめ

写真のファイル名が連番だったので、その名前で並べ替えてから、先頭のファイルをシステム日時にして、残りを1秒ずつずらしなら設定したらキレイに並びました。

同じタグの記事
同じカテゴリの記事