JavaScript/TypeScript で非同期処理を同期実行できる sync-actions というライブラリを公開しました。特に TypeScript では、定義された関数をタイプセーフな方法で呼び出すことができます。これは、非同期としてマークしたくない (またはできない) 関数内で非同期プロセスを実行する場合に使用することを目的としています。
特徴
- Node.jsのworker_threadsを利用します
- 非同期プロセスはサブスレッドで実行され、メインスレッドはその完了を同期的に待機します。
- タイプセーフな関数呼び出し
- TypeScript では、定義された関数の型情報を利用できます。
- ネイティブ ESM として公開
- CommonJS をサポートしないことでシンプルになっています。
リポジトリ
https://github.com/koyopro/sync-actions
使用法
インストール
npmパッケージとして公開されていますので、npm install等でインストールしてください。
npm install sync-actions
基本的な使い方
Promise オブジェクトを返す非同期関数をdefineSyncWorker()に渡すことで、インターフェイスを定義し、launch()でワーカースレッドを開始できます。ワーカーを定義するファイルは他の処理ファイルとは別に作成されるものとします。
// worker.js import { defineSyncWorker } from "sync-actions"; export const { actions, worker } = defineSyncWorker(import.meta.filename, { ping: async () => { // Execute asynchronous process, await new Promise((resolve) => setTimeout(resolve, 1000)); // Return the result as a return value return "pong"; } }).launch();
// main.js import { actions, worker } from "./worker.js"; // You can execute asynchronous functions synchronously console.log(actions.ping()); // => "pong" is output after 1 second worker.terminate();
タイプセーフな関数呼び出し
TypeScript では、defineSyncWorker で定義された関数をタイプセーフな方法で呼び出すことができます。
// worker.ts import { defineSyncWorker } from "sync-actions"; export const { actions, worker } = defineSyncWorker(import.meta.filename, { // By specifying the types of arguments and return values, type-safe calls are possible add: async (a: number, b: number): Promise<number> => { return a + b; } }).launch(); </number>
// main.ts import { actions, worker } from "./worker.js"; // Type-safe call actions.add(1, 2); // => 3 (number) // @ts-expect-error actions.add("1", 2); // => Argument of type 'string' is not assignable to parameter of type 'number' worker.terminate();
背景
ここまでの内容はREADMEと同じなので、作成の背景を記載します。
Accel Record という ORM を開発しています。1 Accel Record は一般的な ORM とは異なり、同期インターフェースで DB アクセスを行うように設計されています。2 DB アクセスを同期的に実行する部分child_processで開始されるサブプロセス内で非同期処理を実行することで実現しました。 module.3 child_process の代わりに worker_threads を使用することで、実行時のオーバーヘッドを削減できると考えました。
Accel Record も、使い勝手の点では Ruby on Rails の Active Record に似ているように設計されており、将来的には CarrierWave のようなライブラリを作成したいと考えています。 CarrierWaveではレコード保存時に画像を外部ストレージサービス(AWS S3など)に保存できますが、Accel Recordでこれを実現するには画像アップロードなどの非同期処理を同期的に実行する必要があります。このプロセスはサブプロセスの代わりにworker_threadsを使用することでより高速に実行できると期待しています。
そこで、worker_threadsを使って非同期処理を同期実行するライブラリを探したことがあります。 synckit や deasync などのライブラリをいくつか見つけましたが、どれも私の側では期待どおりに機能しなかったため、独自のライブラリを作成することにしました。せっかくなのでTypeScriptでタイプセーフに使えるインターフェースを作ろうと思いました。
内部詳細の詳細
- worker_threadsで起動したサブスレッドの非同期処理が完了するまで、メインスレッドはAtomic.wait()でブロックされます。
- MessageChannel はスレッド間の通信に使用されます。 synckit のソース コードは、実装のこの部分で非常に役立ちました。
- worker_threads でワーカーを起動する場合、.ts ファイルを .js にトランスパイルする必要があります。その部分にはesbuildを使用しています。
- Worker を起動するときに、トランスパイルされたソース コードを文字列として Worker に渡して実行したいと考えましたが、私の環境では正しく動作しませんでした。ここが一番苦労した部分です。最終的に、node_modules の下にファイルを書き込み、そのパスをワーカーに渡しました。この方法が最も安定していることが判明しました。
-
「Accel Record」の紹介: Active Record パターンを使用した TypeScript ORM ↩
-
新しい TypeScript ORM に同期 API を採用した理由 ↩
-
TypeScript での同期 DB アクセスのテクニック ↩
以上がJS/TSで非同期処理を同期実行するライブラリをリリースの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

PythonとJavaScriptにはそれぞれ独自の利点があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1. Pythonは、データサイエンスやバックエンド開発に適した簡潔な構文を備えた学習が簡単ですが、実行速度が遅くなっています。 2。JavaScriptはフロントエンド開発のいたるところにあり、強力な非同期プログラミング機能を備えています。 node.jsはフルスタックの開発に適していますが、構文は複雑でエラーが発生しやすい場合があります。

javascriptisnotbuiltoncorc;それは、解釈されていることを解釈しました。

JavaScriptは、フロントエンドおよびバックエンド開発に使用できます。フロントエンドは、DOM操作を介してユーザーエクスペリエンスを強化し、バックエンドはnode.jsを介してサーバータスクを処理することを処理します。 1.フロントエンドの例:Webページテキストのコンテンツを変更します。 2。バックエンドの例:node.jsサーバーを作成します。

PythonまたはJavaScriptの選択は、キャリア開発、学習曲線、エコシステムに基づいている必要があります。1)キャリア開発:Pythonはデータサイエンスとバックエンド開発に適していますが、JavaScriptはフロントエンドおよびフルスタック開発に適しています。 2)学習曲線:Python構文は簡潔で初心者に適しています。 JavaScriptの構文は柔軟です。 3)エコシステム:Pythonには豊富な科学コンピューティングライブラリがあり、JavaScriptには強力なフロントエンドフレームワークがあります。

JavaScriptフレームワークのパワーは、開発を簡素化し、ユーザーエクスペリエンスとアプリケーションのパフォーマンスを向上させることにあります。フレームワークを選択するときは、次のことを検討してください。1。プロジェクトのサイズと複雑さ、2。チームエクスペリエンス、3。エコシステムとコミュニティサポート。

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

node.jsは、主にストリームのおかげで、効率的なI/Oで優れています。 ストリームはデータを段階的に処理し、メモリの過負荷を回避します。大きなファイル、ネットワークタスク、リアルタイムアプリケーションの場合。ストリームとTypeScriptのタイプの安全性を組み合わせることで、パワーが作成されます

PythonとJavaScriptのパフォーマンスと効率の違いは、主に以下に反映されています。1)解釈された言語として、Pythonはゆっくりと実行されますが、開発効率が高く、迅速なプロトタイプ開発に適しています。 2)JavaScriptはブラウザ内の単一のスレッドに限定されていますが、マルチスレッドおよび非同期I/Oを使用してnode.jsのパフォーマンスを改善でき、両方とも実際のプロジェクトで利点があります。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

WebStorm Mac版
便利なJavaScript開発ツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

ドリームウィーバー CS6
ビジュアル Web 開発ツール

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、
