Python3で時間のかかる処理をマルチスレッドで対応する

以下のコードのdo_work_for_big_taskの箇所をお好みの処理に書き換えれば良い。

import threading
from queue import Queue
import time

lock = threading.Lock()



def do_work_for_big_task(item):
    # ここで時間のかかる処理を行う(今回は一秒処理のかかるタスクを行うものと仮定してコンピュータにスリープさせる
    )
    time.sleep(1)
    with lock:
        print(threading.current_thread().name,item)

def worker():
    while True:
        item = q.get()
        do_work_for_big_task(item)
        q.task_done()

# キューを作成する
q = Queue()

#スレッド数: 4
for i in range(4):
     t = threading.Thread(target=worker)
     t.daemon = True
     t.start()

start = time.perf_counter()
# 処理しなければいけないタスクの数:30
for item in range(30):
    q.put(item)

# すべてのタスクが終了するまで待つ
q.join()


#処理が終了してから、実行にかかった事項が表示される
print('time:',time.perf_counter() - start)

Pythonでシングルトンを実装

Pythonでシングルトンメソッドを実装するのに苦労したのでここにメモしておく。

class Singleton:
    _instance = None
    class Inner:pass

    def __init__(self):
        if Singleton._instance is None:
            Singleton._instance = Singleton.Inner()

    def __getattr__(self,attr):
        return getattr(self._instance,attr)
    def __setattr__(self,attr,val):
        return setattr(self._instance,attr,val)


s1 = Singleton()
s1.foo = "hello"
s2 = Singleton()

assert s1.foo == s2.foo

sphinxを使ってドキュメントをコードから自動生成する。

コードからドキュメントから自動生成するには以下のコマンドを入力すれば良い。

sphinx-apidoc -F -o docs/ path/to/your/library

あとは

cd docs
make html
open _build/html

とすればドキュメンテーションがちゃんと読める。

これを使って自分がよく使うライブラリのドキュメントはdocs以下のディレクトリに一元化しておくとかすると メリットがありそうなので早速やってみる。

インターネット上にある画像を自分のところにダウンロードする

Python3.4にてhttp上にある画像をダウンロードしたかったのでメモ。

requestsというライブラリを使うと簡単にできた。

import uuid
import requests
import io

response = requests.get("http://path/to/url")
img_data = io.BytesIO(response.content)
img = Image.open(img_data)
uu = str(uuid.uuid1())
filename = "{}.png".format(uu)

# /tmp/img というフォルダーに保存する
path = os.path.join(os.path.abspath("."),"tmp","img",filename)

fp = open(path, "wb")
fp.write(response.content)
fp.close()