concurrent.futuresを使った並列処理の勉強メモ

pythonにて並列処理をするプログラムを作る機会がありました

いつもはthreadingというモジュールで並列処理をしておりプログラムもそのモジュールにて組みました

しかし、調べてみると最近はconcurrent.futuresというモジュールでやるのが良いということを知りました

なので勉強がてらやってみたのメモとして書いておきます

concurrent.futuresとは

Python3.2で追加された並列処理をするためのライブラリです

“ThreadPoolExecutor”とすればスレッドで並列処理を行います

“ProcessPoolExecutor”とすれば別々のプロセスで処理を行います

そのため、ひとつのモジュールをインポートすればスレッドとプロセスのどちらかで並列処理をしてくれます(個別でThreadingやmultiprocessingをインポートする必要がなくなった)

参考:https://docs.python.jp/3/library/concurrent.futures.html

プログラム

並列処理をするにあたり、以前に作成したWebスクレイピングするプログラムをベースに作成しました

tenki.jpとウェザーニュースの2つの情報をスレッドの並列処理でとってくるプログラムを作りました

参考:

Webスクレイピングをやりたい思いました とくに深い意味はないのですが、やってみたいなーという気になりました 身近でお手軽なものということで天気情報を発信しているサイトをスクレイピングしてみました 手始めにtenki.jpをやってみました
Webスクレイピングしてみたい第二弾です Tenki.jpのスクレイピングに引き続き、次はウェザーニュースをスクレイピングしてみました

また参考として逐次で天気情報を取得するプログラムも追加し、速度検証をしてみました

実行結果

約0.6秒くらい早くなりました

2つのサイトをスクレイピングしているだけなのでThreadしてもしなくても結果はかわりませんが、複数だったら大きく変わると思います

プログラムの解説

スクレイピング方法は前の記事にて書いたので省きます

重要なところは下記のところです

myThreadというリスト(配列)をつくり、その中にスレッド(executor.submit)を入れています

定義の仕方はexecutor.submit(スレッド化させる関数,引数)となっています

最後にfor文にて結果(myThread.result())を出力しています

またwith futures.ThreadPoolExecutor() as executor:のところを”with futures.ProcessPoolExecutor()”とするとプロセスで動きます

おまけプログラム

上記のプログラムは、”executor.submit”で逐次スレッド化するものを追加していました

しかしexecutor.mapを使うと一括でスレッド化するものを追加できます

おまけとして、myWaitTimeというリストのなかに1~10の値をいれ、.mapで一括追加して動かしてみました

結果

finish: 1sec
finish: 2sec
finish: 3sec
finish: 4sec
finish: 5sec
finish: 6sec
finish: 7sec
finish: 8sec
finish: 9sec
finish: 10sec
time = 10.004080295562744

引数をリストで渡してしまえばおkなのところは便利です

スポンサーリンク







フォローする

スポンサーリンク