見出し画像

『退屈なことはPythonにやらせよう』17章 時間管理、タスクのスケジューリング、プログラム起動のらくがき帳📝

こんにちは。aliceです。
金曜日ですね。明日から3連休なので、心がお休みモードになっています。
今日の夕方にワープしたい🙌


今回は時間管理、タスクのスケジューリング、プログラム起動のらくがき帳です。
タイトルが長いですね。
もりもり感がすごいです。


前回のらくがき帳


では、以下らくがきです。



17章 英語版🔤


GitHub💖


17.3 プロジェクト:スーパーストップウォッチ


まだ自動化していない退屈な作業にかかっている時間を計測します⏰

import time


def main():
    print('Press ENTER to begin, Press Ctrl + C to stop')
    input()
    print('Started')
    start_time = time.time()
    lap_num = 1

    try:
        while True:
            input()
            lap_time = round(time.time() - start_time, 2)
            total_time = round(time.time() - start_time, 2)
            print(f'Lap #{lap_num}: {total_time} ({lap_time})', end='')
            lap_num += 1
    except KeyboardInterrupt:
        print('\nDone')


if __name__ == '__main__':
    main()


こんな感じのストップウォッチができました🙌


17.6 マルチスレッド


マルチスレッドがピンとこなかったのでコメントを入れてもらいました。

# スレッディングと時間モジュールをインポート
import threading, time

# プログラムの開始を示すメッセージを表示
print('プログラムの開始')


# 非同期タスクを定義する関数
def take_a_nap():
    # 5秒間スリープ(一時停止)
    time.sleep(5)
    # 5秒後に "Wake up!" と表示
    print('起きてください!')


# 新しいスレッドオブジェクトを作成し、take_a_nap関数をターゲットに指定
thread_obj = threading.Thread(target=take_a_nap)

# スレッドを開始
thread_obj.start()

# プログラムの終了を示すメッセージを表示
print('プログラムの終了')



マルチスレッドを日常に例えていうとなんですか?


17.7 プロジェクト:マルチスレッド版XKCDダウンローダー


あるスレッドがコミックをダウンロードするのに並行して、残りのスレッドでネットワーク接続や画像をディスクに書き込みます。
14個のスレッドを作ってそれぞれダウンロードをします😱

「※本プログラムの使用は控えましょう。」だそうです。
ですよね。

import os
import threading

import requests
from bs4 import BeautifulSoup

# ダウンロード対象のコミック数
total_comics = 140
comic_directory = 'xkcd'


# ダウンロード対象の範囲を指定して、コミックをダウンロードする関数
def download_xkcd(start_comic, end_comic):
    for comic_number in range(start_comic, end_comic + 1):
        comic_url = f'https://xkcd.com/{comic_number}'
        download_comic(comic_url)


# 単一のコミックをダウンロードする関数
def download_comic(comic_url):
    try:
        print(f'コミックをダウンロード中: {comic_url}')
        res = requests.get(comic_url)
        res.raise_for_status()

        soup = BeautifulSoup(res.text, 'html.parser')
        comic_elem = soup.select('#comic img')

        if not comic_elem:
            print(f'コミック画像が見つかりませんでした: {comic_url}')
            return

        comic_url = 'https:' + comic_elem[0].get('src')
        download_image(comic_url)

    except Exception as e:
        print(f'ダウンロードエラー: {str(e)}')


# 画像をダウンロードする関数
def download_image(image_url):
    try:
        res = requests.get(image_url)
        res.raise_for_status()

        image_filename = os.path.basename(image_url)
        image_path = os.path.join(comic_directory, image_filename)

        with open(image_path, 'wb') as image_file:
            for chunk in res.iter_content(100000):
                image_file.write(chunk)

        print(f'画像をダウンロードしました: {image_filename}')

    except Exception as e:
        print(f'画像ダウンロードエラー: {str(e)}')


# ダウンロードスレッドを作成し、ダウンロードを開始
download_threads = []
for start_comic in range(1, total_comics + 1, 10):
    end_comic = min(start_comic + 9, total_comics)
    download_thread = threading.Thread(target=download_xkcd, args=(start_comic, end_comic))
    download_threads.append(download_thread)
    download_thread.start()

# すべてのダウンロードスレッドが完了するのを待つ
for download_thread in download_threads:
    download_thread.join()

print('ダウンロードが完了しました')


こんな感じにダウンロードします。
ホントにこれ、やってよいのかな?
ちょっと怖いです😱


17.9 プロジェクト:シンプルなカウントダウンプログラム


カウントダウン終了後にアラームを鳴らします🔔

import subprocess
import time

time_left = 5
while time_left > 0:
    print(time_left)
    time.sleep(1)
    time_left -= 1

subprocess.Popen(['start', 'alarm.mav'], shell=True)

ティロリーン♪となります。

exeファイルを指定するところとか、Power Automate for Desktopっぽいなーと思いました。

仕事で使っているソフトを設定してPythonから立ち上げて操作したら面白そうだと思ったけど、APIがあったらAPIでいっかと思いました。
(だいたいいつもそうなる🙃)




この記事が気に入ったらサポートをしてみませんか?