LUA a multithreading

toor_vlkodlak

LUA a multithreading
« kdy: 12. 03. 2016, 10:59:26 »
Dobrý den všem přeji. Prosím zde o vysvětlení, jak si poradit s vícevláknovým
zpracováním skriptu napsaného v LUA. Vím, že tuto funkci zastává příkaz
'coroutine' , ale z dosavadního studia jsem zřejmě tuto funkci nepochopil,
nebo někde dělám chybu (pravděpodobnější).

V podstatě se jedná o toto:
Skript je primitivní (bez přetěžování operátorů, metatabulek atd.), zatím poměrně
krátký (cca 4k řádků). Vykonává se v určených intervalech a je částečně interaktivní.

Pokud uvnitř skriptu potřebuji zavolat systém, aby vykonal stáhnutí dat pomocí
'wget', vyčkává zbytek skriptu na dokončení volané aplikace.

Toto chování (zamrznutí skriptu) jsem sice obešel, ale líbilo by se mi LUA řešení
(C a C++ už fakt nedám), kdy je při předem určené situaci zavolání externí aplikace
v systému řešeno jako samostatné vlákno a skript by mezitím pokračoval.

Děkuji všem za případné řešení, nebo nakopnutí správným směrem.


Pavel Tisnovsky

Re:LUA a multithreading
« Odpověď #1 kdy: 12. 03. 2016, 11:46:01 »
Korutiny (nekdo prosazuje termin koprogramy) v tomto moc primo nepomahaji, protoze u nich se nejedna o skutecny soucasny beh. Korutina pouze muze v libovolnem miste pozastavit svuj beh a predat rizeni jine casti programu (yield). Da se to ale trosku ohnout. Jak se ten wget vola? Normalne pres os.execute()?

toor_vlkodlak

Re:LUA a multithreading
« Odpověď #2 kdy: 12. 03. 2016, 12:28:43 »
Přez os.execute() bych jej chtěl volat, ale to právě působuje ono "zamrznutí".

Protože se jedná o skript pro Conky, je to momentálně ošetřeno pomocí
samostatné funkce conky_wget(), kterou Conky zpracovává každou vteřinu
a její výstup dokáže zpracovat jako samostatné vlákno (zbytek skriptu tedy
nečeká).
Není to, to pravé ořechové, protože je nutné konkrétní nastavení konfiguračního
souboru pro Conky a určité přiohýbání LUA skriptu.

Pro případný náhled je skript k dispozici
http://blog.root.cz/nekolikero-postrehu-z-pc-sveta/conky-a-lua/


andy

Re:LUA a multithreading
« Odpověď #3 kdy: 12. 03. 2016, 13:15:02 »
Aspon nejake to C/C++ je pri lue dost uzitocne. Pravy multithreading sa da urobit tak, ze kazde nativne vlakno ma svoj lua_state a data si zdielas cez FFI alebo nejake nativne volania.

Pavel Tisnovsky

Re:LUA a multithreading
« Odpověď #4 kdy: 12. 03. 2016, 16:14:38 »
Přez os.execute() bych jej chtěl volat, ale to právě působuje ono "zamrznutí".

Teď mě ještě napadlo, že jsme řešili něco podobného, tam šlo o to zkontrolovat (popř. stáhnout) data z více URL paralelně, ovšem s čekáním na výsledek. Paralelizace tedy byla na úrovni OS (shellu), ne v Lue. Ještě neučesaná verze je tady: https://github.com/emender/emender-fedora/blob/master/test/TestLinks.lua#L73

Třeba to pomůže (jestli je to stejný případ)-


toor_vlkodlak

Re:LUA a multithreading
« Odpověď #5 kdy: 12. 03. 2016, 20:07:20 »
Přez os.execute() bych jej chtěl volat, ale to právě působuje ono "zamrznutí".

Teď mě ještě napadlo, že jsme řešili něco podobného, tam šlo o to zkontrolovat (popř. stáhnout) data z více URL paralelně, ovšem s čekáním na výsledek. Paralelizace tedy byla na úrovni OS (shellu), ne v Lue. Ještě neučesaná verze je tady: https://github.com/emender/emender-fedora/blob/master/test/TestLinks.lua#L73

Třeba to pomůže (jestli je to stejný případ)-

Děkuji za odkaz. Mám inspiraci pro RSS modul v Conky.

Nakonec jsem problém vyřešil taktéž na úrovni shellu. Proč to přeci dělat složitě, když
to jde jednoduše:

díky parametru -q bude skript fungovat dál a wget stahovat

os.execute("wget --load-cookies "..cookies.." -q "..url.." -O "..soubor)

Při dalším průchodu (po zadaném intervalu) se stačí systému optat, zda-li wget ještě
stahuje. I když zatím stále nechápu funkci 'coroutine', dosáhl jsem požadovaného.
Fungující skript i při stahování potřebných dat.