Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Jann 15. 07. 2015, 12:30:28

Název: Jak spustit soubr.py
Přispěvatel: Jann 15. 07. 2015, 12:30:28
Zdravím, když spustím soubor v Debianu s příponou "py" tak trvá cca 10 sec než se něco načte a zobrazí. Udělá to ale jen po prvním spuštění, při dalším spuštění stejného souboru se zobrazí okamžitě. Neví prosím někdo, jak tohle vyvolat i při dalším spuštění abych nemusel vždy restartovat server ? Díky moc za pomoc.
Název: Re:Jak spustit soubr.py
Přispěvatel: ghost 15. 07. 2015, 12:55:59
Smazat soubor s priponou .pyc ?
Název: Re:Jak spustit soubr.py
Přispěvatel: Jann 15. 07. 2015, 13:05:34
Nee, i když to smažu, načte se to ihned.
Název: Re:Jak spustit soubr.py
Přispěvatel: T 15. 07. 2015, 13:05:50
Restartovat server kvůli tomu, aby se něco zobrazilo pomalu, nedává moc smysl, o co tedy jde? Spouštíš ho pomocí python test.py a restartuješ celý server nebo jde o webserver, který spouští ten skript?
Název: Re:Jak spustit soubr.py
Přispěvatel: Pavouk106 15. 07. 2015, 13:12:05
Teorie mi říká, že jedeš na nějaký VPS, kde Ti běží tak moc věcí, že trvá 10 sekund, než se spustí Python (interpret) - ať už kvůli slabýmu CPU nebo nedostatku RAM (nebo v extrémním případě pomalýmu disku). Při opakovanym spuštění už to jede, protože to už jednou proběhlo a zůstalo to načtený. Zní to pravděpodobně?
Název: Re:Jak spustit soubr.py
Přispěvatel: poustevnik 15. 07. 2015, 14:11:15
Pokud chceš, aby se ti něco spustilo po delší době, použij "sleep". buď v shell skriptu, nebo klidně na příkazové řádce

Kód: [Vybrat]
sleep 10 ; soubor.py
(na jednom řádku, odděleno středníkem)
kde 10 je počet sekund
Název: Re:Jak spustit soubr.py
Přispěvatel: Pavouk106 15. 07. 2015, 14:39:52
Sleep mu to ale protáhne o 10 sekund i při prvním spuštění. Nejdřív je potřeba zjistit, co způsobuje prodlevu u toho prvního spuštění (a eliminovat jí), pak lze sjednocovat.
Název: Re:Jak spustit soubr.py
Přispěvatel: Jann 15. 07. 2015, 14:47:08
Jedná se klasicky HW, OS Debian v lokální síti. Python se spouští přímo z command line. CPU i7 + 32GB RAM +  SSD
Název: Re:Jak spustit soubr.py
Přispěvatel: Jann 15. 07. 2015, 14:49:19
Sleep mu to ale protáhne o 10 sekund i při prvním spuštění. Nejdřív je potřeba zjistit, co způsobuje prodlevu u toho prvního spuštění (a eliminovat jí), pak lze sjednocovat.
Přesně tak, v první řadě potřebuji zjistit, co je příčinou toho dlouhého načítání, které se projevuje pouze při prvním spuštěním a pouze po restartu serveru.
Název: Re:Jak spustit soubr.py
Přispěvatel: gamer 15. 07. 2015, 14:55:42
Přesně tak, v první řadě potřebuji zjistit, co je příčinou toho dlouhého načítání, které se projevuje pouze při prvním spuštěním a pouze po restartu serveru.

strace -tt ./soubor.py
Název: Re:Jak spustit soubr.py
Přispěvatel: e3k 15. 07. 2015, 19:56:49
xtest: spust iny_subor.py a zisti ci tam mas 10sec pauzu.
Název: Re:Jak spustit soubr.py
Přispěvatel: Jann 21. 07. 2015, 10:43:35
Tak jsem se hrál s tím 'strace'

strace -tt ./soubor.py

a zjistil jsem tohle

Kód: [Vybrat]
10:28:04.205286 openat(AT_FDCWD, "/root/dirs/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
10:28:04.206121 getdents(3, /* 102 entries */, 32768) = 6712
10:28:47.169402 getdents(3, /* 0 entries */, 32768) = 0
10:28:47.169733 close(3)                = 0

netuším ale co dělá příkaz 'getdents'. takový příkaz ve svém scriptu vůbec nemám ;)
Název: Re:Jak spustit soubr.py
Přispěvatel: Jann 21. 07. 2015, 10:44:32
xtest: spust iny_subor.py a zisti ci tam mas 10sec pauzu.
Nemám, v jiném souboru se spustí py ihned
Název: Re:Jak spustit soubr.py
Přispěvatel: gamer 21. 07. 2015, 11:12:05
Kód: [Vybrat]
10:28:04.205286 openat(AT_FDCWD, "/root/dirs/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
10:28:04.206121 getdents(3, /* 102 entries */, 32768) = 6712
10:28:47.169402 getdents(3, /* 0 entries */, 32768) = 0
10:28:47.169733 close(3)                = 0

netuším ale co dělá příkaz 'getdents'. takový příkaz ve svém scriptu vůbec nemám ;)

Čte to položky nějakého adresáře /root/dirs/ a to trvá dlouho, takže to brzdí dísk.
getdents je funkce kernelu: http://man7.org/linux/man-pages/man2/getdents.2.html
obvykle se to volá z readdir: http://man7.org/linux/man-pages/man3/readdir.3.html
Název: Re:Jak spustit soubr.py
Přispěvatel: i 21. 07. 2015, 11:33:33
Záleží dost na tom co ten skript dělá / má dělat, Pokud třeba spouští nějakou službu, kterou si nejprve ověřuje zda už neběz, třeba navazováním TCP spojení, tak může poprvé čekat ana timeout, usoudí že neběží, tak jí spustí, podruhé pak se spojí hned a ví že službá běží tak skončí.

Jiná varianta.
může třeba počítat soubory ve filesystému, poprvé se jednotlivé adresáře čtou z disku, podruhé už z cache.

Nebo hromada dalších variant.

Bez znalosti toho co ten skript dělá nebo má dělat se tady vří z vody.
Zkus ho pro poprvá a podruhé spustit v příkazu time a alespoň uvidíš zda čeká na CPU nebo na I/O.