sql >> Databáze >  >> NoSQL >> Redis

Hledáte řešení mezi nastavením mnoha časovačů nebo použitím naplánované fronty úloh

Časovače Node.js jsou velmi efektivně implementovány. Jejich implementace (popsaná v podrobném článku o tom, jak fungují) si snadno poradí s velmi velkým množstvím časovačů.

Jsou uchovávány ve dvojitě propojeném seznamu, který je setříděný a pouze k dalšímu spuštění časovače je přidružen skutečný systémový časovač libuv. Když se tento časovač spustí nebo je zrušen, další v seznamu se stane tím, který je připojen ke skutečnému systémovému časovači libuv. Když je nastaven nový časovač, je pouze vložen do setříděného seznamu a pokud se nestane dalším, který bude spuštěn, pouze sedí v seznamu a čeká, až bude na řadě. Můžete jich mít tisíce velmi efektivně.

Zde je několik zdrojů o tom, jak tyto časovače fungují:

Kolik souběžných setTimeoutů před problémy s výkonem?

Jak nodejs interně spravuje časovače

První reference obsahuje spoustu komentářů ze skutečného kódu nodejs, které popisují, jak funguje systém seznamů propojených s časovačem a pro co je optimalizován.

Druhý článek vám poskytuje trochu vyšší úroveň popisu toho, jak je organizován.

Existují další efekty, takže když se jeden časovač dostane na začátek seznamu a spustí se, pak po zavolání zpětného volání node.js zkontroluje na začátku seznamu jakékoli další časovače, které jsou nyní také připraveny ke spuštění. Tím dojde k odstranění všech ostatních časovačů se stejným "cílovým časem" jako u prvního a také všech ostatních, které nastaly během těchto různých dalších zpětných volání.

Když máte tisíce, vložení nového časovače do seřazeného propojeného seznamu bude trvat o něco déle, pokud je tam hodně časovačů, ale jakmile je vložíte, nezáleží na tom, kolik jich je, protože se vždy dívá pouze na další vystřelí. Takže proces sezení s desítkami tisíc nevyřízených časovačů je jen jeden systémový časovač (představující další událost časovače, která se spustí) a hromada dat. Všechna tato data pro ostatní budoucí časovače vás nic nestojí, když budete jen sedět.

U Javascriptu, podobně jako u prvního řešení pythonu, bych mohl vytvořit tolik setTimeoutů, kolik je potřeba, ale problém je v tom, že všechny časové limity fungují v hlavním vláknu, ale jak jsem řekl, úkoly nejsou náročné na zdroje a potřebuji pouze přesnost za druhé.

Zdá se mi, že nodejs by zvládl vaše množství setTimeout() volá v pohodě. Pokud byste měli problém v node.js, nebylo by to kvůli počtu časovačů, ale museli byste si být jisti, že na problém použijete dostatek CPU, pokud máte na zpracování více práce, než zvládne jedno jádro. Využití jádra můžete rozšířit pomocí klastrování nodejs nebo pomocí pracovní fronty, která používá Worker Threads nebo jiné procesy nodejs, které pomáhají se zpracováním. node.js je sám o sobě velmi efektivní se vším, co souvisí s I/O, takže pokud neprovádíte velké výpočty náročné na CPU, jediné vlákno node.js zvládne spoustu zpracování událostí.

Mějte na paměti, že časovače Javascript nezaručují přesnost. Pokud zablokujete CPU, některé časovače se spustí později, než je plánováno, protože nejsou preventivní. Ale pokud vaše úkoly nejsou náročné na CPU, můžete být v pohodě.




  1. Hadoop RecordReader Úvod, práce a typy

  2. Výčty v MongoDB

  3. E-Commerce API vytvořené pomocí Node-Js, Typescript, PostgreSQL, Redis a Kafka

  4. Mongodb dotaz založený na položce na konkrétní pozici v poli