/ / ako prehľadávať a spracovávať (náročné na procesor) tisíce adries URL pomocou programu gevent a threading? - python, multithreading, asynchrónny, urllib2, gevent

ako prechádzať a spracovávať (CPU intenzívne) tisíce adries URL pomocou gevent a threading? - python, multithreading, asynchrónne, urllib2, gevent

Hrával som s tornádom, krútil som sa, dával som najavo, aby som dosiahol čo najlepší výkon v procese načítania 50 000 adries URL.

Proces, ktorý chcem vytvoriť:

  • analyzovať všetky adresy URL do sady (vyhnúť sa duplikátom)
  • pre každú adresu URL: skontrolujte existenciu adresy URL v zozname povolených súborov redis db (obsahuje milióny adries URL)
  • stiahnite adresy URL pomocou knižníc gevent / other async
  • vložte načítaný obsah do poradia
  • paralelne: počúvajte rad s vláknami
  • spracuje (intenzívny regulárny výraz) položky frontu pomocou vlákien
  • uložiť výstup do MySQL DB
  • pre každú aktualizáciu adresy URL zoznam povolených redis db

Chystám sa denne spracovať milióny adries URL, začal som to implementovať, ale dostal som sa do niekoľkých problémov;

po prvé, vyplnenie frontu s výsledkami Idostať z asynchrónneho prehľadávača spotrebuje veľa pamäte - musím to vyriešiť, čo by bol dobrý postup? po druhé, ťažko sa mi synchronizuje vlákno aj prehľadávač gevent, ako môžem stiahnuť asynchronne a spracovať pri vyplnení frontu výsledkami?

Alebo ako môžem synchronizovať asynchrónny prehľadávač s kódom vlákna, ktorý spracuje odpoveď z asynchrónneho prehľadávača?

Vďaka!

odpovede:

1 pre odpoveď č. 1

Gevent, skrútený, asyncio by mal zvládnuť 50k URL v pohode.

Aby sa zabránilo nadmernej spotrebe pamäte asynchronizovať procesy, ktoré sťahujú a spracúvajú adresy URL, môžete nastaviť maximálnu veľkosť v zodpovedajúcich radoch: ak sa sťahovanie deje príliš rýchlo; zablokuje sa queue.put() keď dosiahne svoju maximálnu kapacitu.

Zelené vlákna by boli na paralelné spracovanie regulárneho výrazu zbytočné. Obyčajné vlákna Pythonu, ktoré používajú skutočné vlákna OS, by tu boli zbytočné, ak by sa počas spracovania regulárneho výrazu neuvoľnil GIL. re neuvoľňuje GIL. regex modul môže v niektorých prípadoch uvoľniť GIL.

Ak používate re modul; možno budete chcieť vytvoriť skupinu procesov namiesto vlákien, kde je počet procesov ~ počet procesorov cpus na hostiteľovi.

Dajte si pozor na to, ako používate MySQL, Redis (pre niektoré scenáre použitia budete možno potrebovať zelený ovládač).