N予備校 プログラミングコース 第22回
あなたは2019年の目標って立てましたか?
どんな目標を立てたか覚えていますか?
私は2018年末に2019年の目標を立てました。
その一つにプログラミングを学び仕事として使えるようにすることをあげました。
そして、思い立ったが吉日と「N予備校のプログラミングコース」を申し込みました。
そして受講と同時に自身の振替と、これから始めようと考えている人の参考になればとブログを書き始めました。
今回ブログの移設にともない、再度そのブログを読み返しながら、今思うことを加えて記載していきたいと思います。
また私が受講したのは【2018年度】で、現在公開されている【2019年度】との違いについても書いていきたいと思います。
このブログは、初心者が学びながら書いているため、間違っている場合があります。
分かり次第修正していくつもりです。
そのあたりも含め楽しんでいただければと思います。
最後に進めていてわからなかったところや気になったところをまとめています。
プログラミング入門 webアプリコース 第22回
前回、ボットプログラムをSlackで動作させることができるようにしました。
しかし、前回の内容ではボットを再起動する度に情報が失われてしまいます。
そこで、今回再起動しても情報が保持されるボットプログラムを作成するために同期I/Oと非同期I/Oについて学びます。
- 今回の内容まとめ(第3章 09)
・同期I/Oと非同期I/Oについて
-
今回の目標
同期I/Oと非同期I/Oを理解する
- 今回新しく扱っているコマンド等
・appendFile関数
・appendfileSync関数
同期I/Oと非同期I/Oについて
I/Oは、InputとOutputの頭文字をとったものです。
Inputは入力、Outputは出力という意味ですので、I/Oは入出力処理のことをいいます。
非同期I/Oは何かを実行している間にも他の処理を実施します。
一方、同期I/Oとは、何かを実行している間はプログラムを停止してその処理が終わることを待ちます。
そのため、非同期I/Oでは同時に二つのことを処理することが可能ですが、同期I/Oでは何か別のことを処理しようとすると、もともとやっていた作業が止まってしまいます。
非同期I/Oを使ったプログラミング
今回は非同期IOを使ったプログラミングを作成します。
ファイル書き込むプログラム(appendFile関数)
今回はファイルに文字を書き込むというプログラムをappendFile関数を用いて作成します。
const fs = require(‘fs’);
const fileName = ‘./test.txt’;
for (let count = 0; count < 500; count++) {
fs.appendFile(fileName, ‘あ’, ‘utf8’);
fs.appendFile(fileName, ‘い’, ‘utf8’);
fs.appendFile(fileName, ‘う’, ‘utf8’);
fs.appendFile(fileName, ‘え’, ‘utf8’);
fs.appendFile(fileName, ‘お’, ‘utf8’);
fs.appendFile(fileName, ‘\n’, ‘utf8’);
}
1行目で、fsモジュール(ファイルを扱うモジュール)を読み込みます。
2行目で、test.txtファイルを指定しており、それをfileNameという変数に入れています。
4~9行目で。それぞれfilename(test.txtファイル)に「あ」「い」「う」「え」「お」改行、を書き込みます。この作業を、for関数により500回繰り返します。
今回のプログラムは、非同期プログラムであるため
「あ」を書き込む作業
「い」を書き込む作業
「う」を書き込む作業
「え」を書き込む作業
「お」を書き込む作業
「改行」を書き込む作業
がそれぞれが終わらずに実行されている(同時に実行されている)ため、結果が「あうえおい」のようにバラバラになります。
そこで、同期I/Oを使ったプログラムを変更します。
同期I/Oを使ったプログラミング
非同期I/Oでは、「あ」の書き込む前に「い」の書き込みが行われるため結果がバラバラになってしまいます。
そこで、「あ」の書き込みが終わってから「い」の書き込みが行われるように同期I/Oを使ったプログラムに変更します。
順序通りに書き込むプログラム作成(appendfileSync関数)
appendFile関数をappendFileSync関数に変更することで、「あいうえお」のように順番通り書き込むプログラムを作成します。
const fs = require(‘fs’);
const fileName = ‘./test.txt’;
for (let count = 0; count < 500; count++) {
fs.appendFileSync(fileName, ‘あ’, ‘utf8’);
fs.appendFileSync(fileName, ‘い’, ‘utf8’);
fs.appendFileSync(fileName, ‘う’, ‘utf8’);
fs.appendFileSync(fileName, ‘え’, ‘utf8’);
fs.appendFileSync(fileName, ‘お’, ‘utf8’);
fs.appendFileSync(fileName, ‘\n’, ‘utf8’);
}
これにより、
「あ」を書き込む作業
「い」を書き込む作業
「う」を書き込む作業
「え」を書き込む作業
「お」を書き込む作業
「改行」を書き込む作業
がそれぞれが終わり次第次の作業に移るので以下のように「あいうえお」の順番で書き込まれます。
今回は、同期I/Oと非同期I/Oについて学びました。
同期I/Oは、確実に作業を実行できるメリットがありますが、1つの作業が終わってから別の作業に移るために処理に時間がかかってしまいます。
非同期I/Oは、複数の作業を同時に実行するため処理時間が短くすみますが、作業が同時に行われるため処理の順番がバラバラになります。
次回はこれらの概念を用いて、再起動の際に情報が保持されるようにプログラムを作成します。