luasocketによるノンブロッキングI/O
コルーチンスケジューラーと統合したノンブロッキングモードでluasocketを使用します。
「luasocketによるノンブロッキングI/O」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
luasocket とは
luasocket は、TCP/UDP ソケット、HTTP、FTP、SMTP クライアントを提供する Lua ライブラリです。デフォルトではブロッキング動作ですが、ノンブロッキングモードで非同期 I/O を利用できます。
luasocket のインストール
LuaRocks 経由でインストールします: luarocks install luasocket。スクリプト内で require します。
local socket = require("socket")
local tcp = socket.tcp()TCP ソケットの作成
TCP クライアントソケットを作成し、サーバーに接続します。
local tcp = socket.tcp()
tcp:connect("example.com", 80)
tcp:send("GET / HTTP/1.0\r\nHost: example.com\r\n\r\n")
local response = tcp:receive("*a")
tcp:close()
print(response:sub(1, 200))ノンブロッキングモード
tcp:settimeout(0) でソケットをノンブロッキングに設定します。データの準備ができていない場合、読み書きはタイムアウトエラーを返してすぐに戻ります。
tcp:settimeout(0) -- non-blocking
local data, err = tcp:receive(1024)
if err == "timeout" then
-- no data yet, try again later
elseif data then
print("Got:", data)
endコルーチンとの統合
ノンブロッキングソケットとコルーチンを組み合わせます。データの準備ができていないときは yield し、セレクタが準備完了を示したときにコルーチンを再開します。
local function readAsync(sock)
while true do
local data, err = sock:receive(1024)
if data then return data end
if err ~= "timeout" then error(err) end
coroutine.yield() -- let other tasks run
end
endsocket.select
socket.select(readSet, writeSet, timeout) は I/O の準備ができたソケットの集合を返します。これは適切なイベントループの基盤となります。
local readable, writable = socket.select({sock1, sock2}, nil, 0.1)
for _, s in ipairs(readable) do
local data = s:receive(1024)
-- handle data
endHTTP クライアント
luasocket には、簡単なリクエストに使用できる高レベルの HTTP モジュールが含まれています。
local http = require("socket.http")
local body, code = http.request("http://example.com")
print(code, #body)UDP ソケット
UDP はコネクションレスです。データグラムベースの通信には socket.udp() を使用します。
local udp = socket.udp()
udp:setsockname("*", 0)
udp:sendto("hello", "127.0.0.1", 9999)
local data = udp:receive()
udp:close()タイムアウト
:settimeout(seconds) でタイムアウトを設定します。タイムアウトを 0 にするとノンブロッキングになり、正の数値では部分的なブロッキングが許可され、nil では無期限にブロックします。
エラー処理のパターン
luasocket の関数は、失敗時に nil とエラー文字列を返します。必ず 2 番目の戻り値を確認します。
local ok, err = tcp:connect("host", 80)
if not ok then
error("Connection failed: " .. tostring(err))
endOpenResty という選択肢
LuaJIT で本番用のノンブロッキング I/O を実装する場合、OpenResty の cosockets のほうがはるかに高機能で高性能です。luasocket はスタンドアロンのスクリプトや簡単なツールに使用します。
ノンブロッキングに関する質問
tcp:settimeout(0) は何をしますか?
まとめ: ノンブロッキング I/O
ノンブロッキングソケットには settimeout(0) を使用し、I/O の多重化には socket.select を使用します。コルーチンと組み合わせ、タイムアウト時に yield し、データの準備ができたら再開します。高性能な非同期 I/O には、OpenResty または luv をお勧めします。
よくある質問
「luasocketによるノンブロッキングI/O」レッスンは無料ですか?
はい。「luasocketによるノンブロッキングI/O」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「luasocketによるノンブロッキングI/O」で何を学びますか?
コルーチンスケジューラーと統合したノンブロッキングモードでluasocketを使用します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「luasocketによるノンブロッキングI/O」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- シンプルなイベントループの構築
- コルーチンによるAsync/Await
- Promise風パターン
- luasocketによるノンブロッキングI/O