BG Development


Страници: (4) [1] 2 3 ... последна »  ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Blocking IO multiplexing
Gamma Goblin
Публикувано на: 21-05-2019, 17:14
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2358
Регистриран на: 21.02.18



Под *NIX има една функция poll()/select() която ти казва върху кой файлов дескриптор може да извършваш действия които те интересуват - например да пишеш/четеш. Яката работа е, че това нещо работи и за БЛОКИРАЩИ операции.

Конкретен пример:

Искаш да прехвърляш stdout/stderr на child процес. Тривиалния начин е да пуснеш 2 нишки - една за stдout & една за stderr, които четат от потока и блокират докато не се появят байтчета за четене, или процеса не умре. Тъпата работа на тривиалния начин е, че не можеш да кажеш на тия нишки да се самоубият, защото те може да са блокирали, а четенето няма timeouts.

Якия начин е да се направи с poll/epoll/select - така хем имаш 1 нишка вместо 2, хем може да и кажеш да приключи когато ти е кеф.


Та ми стана интересно в уиндоуса това може ли да се направи ?

Това мнение е било редактирано от Gamma Goblin на 21-05-2019, 17:15


--------------------
https://www.rust-lang.org/
---
Хора, които са прекалено умни, за да се занимават с политика, са наказани да бъдат управлявани от глупаци.
---
PMEmail PosterUsers Website
Top
dvader
Публикувано на: 21-05-2019, 17:46
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 4475
Регистриран на: 12.07.05



QUOTE (Gamma Goblin @ 21-05-2019, 17:14)
Та ми стана интересно в уиндоуса това може ли да се направи ?

Не.


--------------------
I find your lack of faith disturbing
PM
Top
Gamma Goblin
Публикувано на: 21-05-2019, 19:10
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2358
Регистриран на: 21.02.18



QUOTE (dvader @ 21-05-2019, 17:46)
QUOTE (Gamma Goblin @ 21-05-2019, 17:14)
Та ми стана интересно в  уиндоуса това може ли да се направи ?

Не.

Колко неочаквано :Д


--------------------
https://www.rust-lang.org/
---
Хора, които са прекалено умни, за да се занимават с политика, са наказани да бъдат управлявани от глупаци.
---
PMEmail PosterUsers Website
Top
ici
Публикувано на: 21-05-2019, 19:16
Quote Post


Group Icon
Име: Ивайло Илчев ики
Група: VIP
Ранг: Почетен член

Мнения: 16253
Регистриран на: 06.06.04



В Windows това се прави с pipes, overlaped и пр. Имам някъде из сорсовете DLL който викаше python engine-a и прехващаше и стандартните потоци с тарбички.


--------------------
Reading undefined locations provides undefined data.
PMEmail PosterUsers Website
Top
gat3way
Публикувано на: 21-05-2019, 22:59
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3912
Регистриран на: 22.06.12



Е то и в линукс се прави с pipe-ове, ако искаш да четеш изхода на дъщерния процес де, няма как да стане по друг начин освен да му затвориш стандартния изход и да му подадеш пайпа вместо него. Само че ми се струва че четенето все пак няма да зависне ако дъщерният процес умре, защото ще получиш съответния сигнал за счупен пайп и оттам вече може да си утрепеш нишката. А всъщност не знам дали сигнала не се пращаше само на процеса дето пише в пайпа, не на този дето чете, ако е така все пак, значи си е крива работа верно.
PMEmail Poster
Top
SuN
Публикувано на: 21-05-2019, 23:08
Quote Post


Group Icon
Име:
Група: Администратор
Ранг: Почетен член

Мнения: 8670
Регистриран на: 27.01.05



QUOTE
Тривиалния начин е да пуснеш 2 нишки

Тривиалния начин е с o_noblock и да проверяваш за eagain.

Абе струва ми се, че не знаеш какво правиш. Най-юникския начин ще е да напишеш отделни, малки програми, които правят само едно нещо, но го правят добре и после да ползваш баша за да режисираш изпълнението и комуникацията между тях.

Отделно, че не разбирам колко време и данни си мислиш, че ще прочетеш от stderr. В общия случай процеса умира веднага след като напише грешката. Ако не пише грешка, а само плюе предупреждения, то може да го игнорираш.

Това мнение е било редактирано от SuN на 21-05-2019, 23:16
PMEmail Poster
Top
dvader
Публикувано на: 22-05-2019, 00:13
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 4475
Регистриран на: 12.07.05



QUOTE (Gamma Goblin @ 21-05-2019, 19:10)

Колко неочаквано :Д

Във Виндовс не се занимават с глупости.
Има си доста мощно асинхронно I/O, което за сметка на повече памет е по-удобно от линукското.
Просто не работи със stdin/stdout, щото хората са решили, че обратната съвместимост е по-важна и че едва ли ще трябва да хендълваш 100К конзоли.

Ако беше питал как да управляваш 100К сокета от 4 треда щях да ти кажа.


--------------------
I find your lack of faith disturbing
PM
Top
gat3way
Публикувано на: 22-05-2019, 00:25
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3912
Регистриран на: 22.06.12



Па да беха направили един читав сървър с това мощно виндовско асинк ио icon_smile.gif
PMEmail Poster
Top
dvader
Публикувано на: 22-05-2019, 00:46
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 4475
Регистриран на: 12.07.05



nginx не е читав ли?
Освен това, читавостта на един сървър се определя не само от това, колко сокета може да държи но и от това, колко сокета му се налага да държи. Ако хендълваш всичко за наносекунди няма и да има нужда да държиш много сесии.

Това мнение е било редактирано от dvader на 22-05-2019, 00:48


--------------------
I find your lack of faith disturbing
PM
Top
Gamma Goblin
Публикувано на: 22-05-2019, 06:02
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2358
Регистриран на: 21.02.18



QUOTE
Тривиалния начин е с o_noblock и да проверяваш за eagain.

Ами няма нужда от o_noblock защото и така рботи добре. Вярно че се правят 2x syscalls вместо 1x, но за нещо което се очаква да генерира много байтчета е ок.

QUOTE
Отделно, че не разбирам колко време и данни си мислиш, че ще прочетеш от stderr.
Колкото е необходимо icon_smile.gif Примерно ако на жава процеса му изпратиш kill -3, той си пише thread dump в standard out-a icon_smile.gif И съответно не искам да го загубя ами да си го логна в някакъв лог файл и да си го гледам после.

QUOTE
Най-юникския начин ще е да напишеш отделни, малки програми, които правят само едно нещо, но го правят добре и после да ползваш баша за да режисираш изпълнението и комуникацията между тях.
Скриптовете са хуй с две остриета

QUOTE
Отделно, че не разбирам колко време и данни си мислиш, че ще прочетеш от stderr. В общия случай процеса умира веднага след като напише грешката.
Не е така icon_smile.gif Това важи само за short lived програми, които в общип случай са напълно ирелевантни,

QUOTE
щото хората са решили, че едва ли ще трябва да хендълваш 100К конзоли.

Това е защото са глупави. Примерно с TMUX може да хендълваш много конзоли, но в майкрософт им липсва иновативността и се самоограничават, защото МИСЛЕЛИ. Мисленето не е за всеки.


QUOTE
колко сокета му се налага да държи

Ако имаш много сокети значи имаш IO-bound задача, и това колко конкурентно отворени сокета имаш е следствие от това колко са ти бавни клиентите и не зависи от сървъра.


--------------------
https://www.rust-lang.org/
---
Хора, които са прекалено умни, за да се занимават с политика, са наказани да бъдат управлявани от глупаци.
---
PMEmail PosterUsers Website
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (4) [1] 2 3 ... последна » Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0