プログラミング奮闘記

難しいと評判!初心者がN予備校でプログラミングを学んだ感想と備忘録!
No.22:同期・非同期I/O

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は、複数の作業を同時に実行するため処理時間が短くすみますが、作業が同時に行われるため処理の順番がバラバラになります。

次回はこれらの概念を用いて、再起動の際に情報が保持されるようにプログラムを作成します。

ABOUT ME
GoodAmbition
オンライン塾経営者(大阪大学工学部出身の元開発技術者) 自身も家庭教師や塾講師として働きつつ、後輩の育成やオンライン塾を経営しています。 私自身も約10年にわたり家庭教師や塾講師として100人以上の受験生と向き合ってきました。 色々な学生、保護者の方とかかわる中でよく質問される内容や、受験に必要な内容について書いています。 独学で頑張っている人たちへ勉強計画や悩み相談なども受け付けていますので気軽にお問い合わせください。 就職活動や資格の勉強などで悩んでいる方もご連絡ください。 教育・就活、書籍、食べ歩きに関するお話がメインです。 最近取り組んでいること プログラミング、筋トレ、マラソン、ライティングスキル向上etc. 苦手なことを克服しようと頑張っています。