web学習日記

プログラミングやweb関係を学んだことを呟くブログ

ブロッキングとノンブロッキングの違いとはなにか?

そもそもノンブロッキングて何?

 ノンブロッキングとはnode.jsなどではノンブロッキングI/O とも呼ばれる

 何かを処理したり、何かを処理前に、処理待ちが発生する場合、
すぐに関数から何か返答返ってくる処理のこと。I/O  (input/outputの略) 入出力という意味 
何かしらの情報をinput(入力)して、
処理結果をoutput(出力)する一連の流れをI/Oと呼ぶ。

よく理解できないのでブロッキング処理(同期処理)と、非同期処理を理解する必要がある

ブロッキング(同期処理)との違い

●処理前に待ち時間が発生するか。

ブロッキング処理とはある操作に対して順番に処理する流れのこと、

同期通信とも呼ばれる。操作を順番に処理するため、操作と操作の間に待ち時間が生ずる。

目玉焼きの例に例えると

フライパンを火にかける
↓
油をひく
↓
卵を割る
↓
水を入れる
↓
フタをする
↓
出来上がる
↓
皿を用意する
↓
皿に盛りつける

解説するとフライパンを火にかける間はほかの処理には手を付けないこと
つまりこの例だと上から下まで順番に処理が行く。

非同期処理との違い

● 処理完了の通知が来るか

非同期処理はブロッキング処理と違い、操作に同期しないで、処理を行うことができること。ノンプロッキングも同期をしないため、
非同期処理に含まれるが、通知を返す点で違いがある。
非同期処理は同期処理と違い、処理が完了すると通知が返ってくる、そのために通知が返ってくるまでの間は、ほかの処理を行える。

目玉焼きに例えると

フライパンを火にかける
↓
油をひく
↓
卵を割る
↓
水を入れる
↓
フタをする
↓
出来上がりの通知が来るまでの間で皿を用意する
↓
出来上がりの通知が来たら皿に盛りつける

この場合だと、ふたをした後、出来上がりの通知が来るまでの間、皿を用意するという別の処理が実行される。
できあがったかの確認をすることなく、出来上がった通知が来てから皿に盛り付けている。

ノンプロッキングの場合

処理完了の通知はなく、完了を待つことがない、処理が完了していない場合は、
エラー通知を受け取ることで状況を把握できる。

目玉焼きに例えると

フライパンを火にかける
↓
油をひく
↓
卵を割る
↓
水を入れる
↓
フタをする
↓
数秒毎に卵に火が通っていないかチェックする
↓
卵に火が通っていなかったので、とりあえず皿を出す
↓
数秒毎に卵に火が通っていないかチェックする
↓
出来上がっていたので皿に盛る

違いは非同期処理では目玉焼きに火が通ったかどうかは通知によって知ることができます。
ノンプロッキングでは、処理がすぐにできない場合、エラーが返ってきてブロック状態にさせないという処理を行う。

ノンブロッキングのメリット

 ①1スレッドを多重化することで、複数のリクエストにも対応可能です。
 ②低速なネットワークであったとしても、処理やCPUの効率が向上する

デメリット

 ①実装することが難しく、適切に並行処理を行えるようにするためには、
 プログラミングの技術が必要。
 並行処理を行うためのツールも用意しなければならない点。
 ②時間がかかるようなI/O処理を行うと、
 処理が追いつかずに全体のパフォーマンスが低下する危険性がある。
 ほかの処理をしている間は処理速度が低下する

まとめ

ノンプロッキングとはある処理を行っている最中も並行して他の処理が(進められるだけ)進む
ブロッキングとはある処理が完了するまで処理をしない

はじめてNode.jsについて学ぶ① 

f:id:nana205:20200506221026j:plain
node.js
最近web開発サービスでnode.jsで作られたサービスが増えたことに興味があったのと、
個人的にほかの言語を新しく覚える必要がないという 理由で学習コストが低く、かつそれなりに情報量があると思い、学んでみようかと思いました。今回はそのまとめです。

Node.jsとは

javascriptで動作するサーバー環境 webサーバーと言うと、ApatchやngnxなどのHTTPサーバー上でPHPなどを動作させる環境を思い浮かべる人が多いかもしれないが、
Node.jsはそれらとは違い、サーバーを作るところから実装がはじまる。

特徴

 ①javascriptでサーバーサイドの処理を実行する
 ②非同期II/O、ノンプロっキングI/Oモデルを採用している
 ③インベント駆動型
 ④シングルスレッド
 ⑤Googleの「V8」という優秀なjavascriptエンジンで動作する

※②ファイルの読み込みのような時間がかかる処理を非同期に実行ができる,処理を詰まらせずにできる

※③何かのきっかけで処理を行う仕組み

※④プログラムの処理が単一に行われること

※⑤chromeで使われているJavascriptエンジン

イベントループなサーバー

webサーバーの種類

apache :接続ごとにメモリを確保する為、同時リクエスト数に上限がある。
NGINX:イベントループで非同期の為同時リクエストに強い。

I/Oとは

アプリケーション外部との入出力処理を I/O といいます。
例えばファイルからデータを読み取る処理や、Socket からデータを読み込む処理を指す。 f:id:nana205:20200507153642p:plain

イベントル=プなサーバーのメリット

メモリ消費を抑えることができる
多くのユーザーの同時アクセス・大量リクエストを捌きやすい。
イベントループで処理を待たずに、イベントが呼ばれるまでループする

node.jsでwebサーバーを立ててみる

httpのcreateServerを使う。

var http = require(' http'); 
var server = http. createServer( function( req, res) 
{  res. writeHead( 200, {'Content-Type': 'text/ plain'}); 
res. write(' Hello World'); res. end(); }); 
server. listen( 1234); 
console. log(' サーバ を 起動 し まし た'); 

モジュール

コード再利用のための部品
● fs
●http/https
dns
●path など

EJSとは

Node.js用のテンプレートエンジン

使い方
タグ 説明
<%=キー名%> サーバ サイド で キー 名 に 指定 し た 値 を 書き出し ます。
値 に HTML タグ 等 が 含ま れ て い た 場合 は エスケープ さ れ る
<%-キー名%> サーバ サイド で キー 名 に 指定 し た 値 を 書き出し ます。
値 に HTML タグ 等 が 含ま れ て い た 場合 は エスケープ さ れ ない
<%処理%> 記述 さ れ た 処理 が レンダリング の 際 に 実行 さ れ ます。
なお、処理はサーバーサイドで実行される

使用例

<! DOCTYPE html > 
< html > 
< head > 
< meta charset =" utf-8">
 < title ><%= title %></title >
 </ head > 
< body > 
< ul >
 <% for (var i = 0; i < 3; i ++) { %> 
 < li ><%= i %></li > <% } %> 
</ ul > <%- contents 1 %> 
 <%= contents 2 %>
 < ol > 
<% arr. forEach( function( val) { %> 
< li ><%= val %>
</li >
<% }) %> 
</ ol > 
</ body >
 </ html >

Express を使う

●Node.js用のフレームワーク シェアが高い
●スケルトンプロジェクトのジェネレーターもある
●基本的な機能はほぼ揃っている

Expressでサイト作成

●グローバルにインストール

npm install express-generator -g

※「express-generator」という npmモジュールを使用すると、
アプリのひな型を自動生成することができます。 ビューのテンプレートエンジンも選択でき、
すぐに動作を確認することが可能

●expressアプリケーションの作成

express -e myapp  

(-eはejs、myappというプロジェクト)

●サーバー起動

cd myapp,npm install,npm start

まとめ

●node.jsはサーバーサイドで記述することができる
●大量アクセスにも耐え、高速処理を実現できる。
●I/Oとはアプリケーション外部との入出力処
●ライブラリやモジュールが豊富
●EJS などのテンプレートエンジンがある
●node.jsのフレームワークexpressを使えば簡単にwebアプリを構築することができる

Makefileを作る

dockerコマンドを打つのが辛かったのでmakeコマンドを利用しました。 この前エンジニアの方にアドバイスを受けて作ってみたのですが、大変便利で使いやすいです。 何より、dockerコマンドを短く書くことができるのでとてもいいです。 こちらはCakePHPプロジェクトに書いているコマンドです。サンプルサイトを参考にしました。

all:     install up
.PHONY: all

up:
    docker-compose up -d
.PHONY: up

install:
    docker-compose run composer install --ignore-platform-reqs --no-interaction
.PHONY: install

migrate:
    docker-compose run php-cli bin/cake migrations migrate
.PHONY: migrate

test:
    docker-compose run php-cli ./vendor/bin/phpunit
.PHONY: test
exec:
    docker exec -it docker_cakephp3_tutorial_phpfpm_1 /bin/sh
.PHONY:sh
sh:
    docker exec -it docker_cakephp3_tutorial_mysql_1 /bin/sh
.PHONY:sh
clean:
    docker-compose down
.PHONY: clean