- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
if ($.browser.msie && $.browser.version < 8) {
$("div.banneritem:gt(0)").remove();
$("#viewnow").remove();
$("#morerealestates").css("margin-top", "-26px");
$("img[align=right]").css("float", "right");
}
else {
setTimeout(function(){
slider();
}, 0);
}
var got = $("div.banneritem:eq(0)").find("#preview").find("a").attr("href");;
var timer = 7500;
var anim = 750;
function slider()
{
setTimeout(function(){
do_slide(0);
setTimeout(function(){
do_slide(1);
setTimeout(function(){
do_slide(2);
setTimeout(function(){
do_slide(2, true);
setTimeout(function(){
do_slide(1, true);
setTimeout(function(){
do_slide(0, true);
slider();
}, timer);
}, timer);
}, timer);
}, timer);
}, timer);
}, timer);
}
function do_slide(v,rev)
{
x = "div.banneritem:eq(" + v + ")";
if(rev==null)
{
$(x).slideUp(anim);
foo = $("div.banneritem:eq(" + (v+1) + ")").find("#preview").find("a").attr("href");
}else
{
$(x).slideDown(anim);
foo = $("div.banneritem:eq(" + (v-1) + ")").find("#preview").find("a").attr("href");
}
if(foo!=null) got = foo;
}
$("#viewnow").click(function(){
window.location=got;
});
Lure Of Chaos 16.05.2014 12:31 # +2
с чем??
DrDre 16.05.2014 19:02 # 0
guest 16.06.2015 16:14 # 0
guest 16.06.2015 16:17 # 0
А чо.
Stallman 16.06.2015 16:44 # 0
guest 16.06.2015 16:47 # 0
guest 16.06.2015 16:50 # 0
guest 16.06.2015 17:12 # 0
guest 16.06.2015 17:19 # 0
В одном потоке, на евент лупе отлично реализуется кооперативная многозадачность (см asyncio, для примера)
guest 16.06.2015 18:25 # 0
guest 16.06.2015 18:38 # 0
Так гуи тред - это браузер. Где гуй в чистом экма?
guest 16.06.2015 18:42 # 0
Посмотрите как в C# работают с GUI тредом, например.
guest 16.06.2015 18:44 # +1
guest 16.06.2015 19:23 # 0
В awt (и в других UI) нельзя рисовать из *соседних* потоков: все равно нужно ставить задачу гуйному потоку.
Просто в JVM у тебя есть другие потоки, и потому жить проще. Но ёбля все равно есть. А вот в C# есть async/await, и потому код получается в тысячу раз чище.
Безусловно, один тред это проблема браузера.
Но отсутствие сахара для асинхронного кодинга -- проблема JS
guest 16.06.2015 19:28 # 0
>Но отсутствие сахара для асинхронного кодинга -- проблема JS
Но не ecma. Подавляющее большинство языков его не имеет.
guest 16.06.2015 19:30 # 0
Такие штуки есть в C#, Python и еще много где.
Уж кому-кому а JSу с его лямбдами и соответствующим окружением стыдно такого не иметь.
guest 16.06.2015 20:03 # 0
guest 16.06.2015 20:09 # 0
так красиво работают с yield from, что практически в язык.
guest 16.06.2015 20:14 # 0
guest 16.06.2015 20:16 # 0
Конечно было бы круче всместо yield from иметь настоящий async/await, но все же это наголову лучше лесенок из timeOut которые лечит какой-то неизвестный чел на гитхабе
guest 16.06.2015 20:18 # 0
Кстати, в фитоне лесенки на один уровень не уберешь.
guest 16.06.2015 20:26 # 0
Просто в JS (как мы видим) глубина лесенки есть функция от количества задач, которые нужно выполнить последовательно.
А в пистоничке это так
@asyncio.coroutine
def test():
yield from create()
yield from write()
yield from close()
# еще 149 задач
yield from asyncio.sleep(2.0)
loop.stop()
guest 16.06.2015 22:00 # 0
guest 16.06.2015 22:11 # 0
Пройдет лет десять еще, и каждый язык (ну кроме JS конечно же) будет иметь встроенные средства для асинхронного программирования, как например всякий язык должен иметь идиому для итерации по коллекции (хотя когда-то паттерн итератор был в новинку).
guest 16.06.2015 22:25 # 0
- Гуй (тут c#)
- Сервера, ибо проблема c10k (тут языки для веба)
Остальным оно кагбэ не нужно. Асло, нужно асинхронное api - без него от сахара проку 0. Я вот до сих пор не знаю как в питоне асинхронно делать http запросы хоть как-то, а еще лучше с тем же комфортом что в requests. Асинхронный сервер есть - а запросы из него отправлять нельзя, и нахер он нужен?
guest 16.06.2015 22:35 # +1
Остальным нужно для чего угодно, что упирается в асинхронный ресурс. А таким ресурсам относятся например стримы (HTTP, файлы и прочая), так что ты прав когда говоришь про HTTP запросы.
Вот тебе пример как это сделали на python, правда жалко что этого пока нет в стандартной либе. Ну впрочем в JS этого тоже нет.
https://pypi.python.org/pypi/aiohttp/0.16.5
response = yield from aiohttp.request('GET', 'http://python.org')
body = yield from response.read()
print(body)
Вообще говоря потоки нужны когда ты хочешь распаралелиться на восемь своих ядер.
Когда у тебя одно ядро, или когда у тебя задача не упирается в CPU (а упирается во внешний аснихронный ресурс типа упомянутых тут стримов) то толку от потоков никакого нет.
Достаточно одного потока с нормальынм асинхронным программированием. Важно просто чтоб проц не простаивал, пока ты ждешь байтиков из внешнего ресурса.
Просто раньше люди не умели такого вот асинхронного программирования, вот и плодили потоки (ну или процессы).
Иными словами треды -- одна из реализаций асинхронного программирования, а евентлуп с кооперативкой -- другая
guest 16.06.2015 22:54 # 0
>Остальным нужно для чего угодно, что упирается в асинхронный ресурс. А таким ресурсам относятся например стримы (HTTP, файлы и прочая), так что ты прав когда говоришь про HTTP запросы.
Но я же это и упомянул.
>Вот тебе пример как это сделали на python,
И там будет в лучшем случае копия urllib? Посимпотичней ничего нет?
>Вообще говоря потоки нужны когда ты хочешь распаралелиться на восемь своих ядер.
Не только. Потоками проще писать. Есть код работающий в одном экземпляре. Нужно запустить n экземпляров параллельно? Не проблема, хуярим n тредов. Подводных камней практически нет, править ничего не надо. Для асинхронного подхода нужно заменить все блокирующие вызовы на асинхронные, отделять долгоиграющие операции итд. Как по мне, многопоточность в 100 раз проще в написании, а нормальные языки без проблем держат до 1000 потоков (языки с gil не в счет, там уже на 60 просадка раза в 2). А асинхронность стоит вводить, когда синхронный подход не срабатывает.
Stertor 16.06.2015 23:04 # 0
Ну я же дал ссылку) Там всё сделано совершенно в идеологии asyncio. Пишешь корутину, пихаешь её на евентлуп и наслаждаешься.
>>Потоками проще писать
Ну если не нужно синхронизировать их между собой то да, а если нужно? Придется половину кода делать потокобезопасным, критические секции всякие выделять, следить чтоб переменная в кеше не застряла, ловить потом хейзенбаги которые раз в 500 лет случаются.
А дебажить знаешь как это приятно?
И кстати не факт что это будет быстрее с таким количеством синхронизации.
>> нормальные языки без проблем держат до 1000 потоков
Если речь идет о настоящих потоках (про которые знает ОС, а не про всякие легкие, зеленые итд) то щедулер операционки может и охуеть от переключения контекста. Да и каждый поток все таки тянет за собой структуры в памяти ядра, а она тоже не резиновая.
>> языки с gil не в счет, там уже на 60 просадка раза в 2
В языках с gil вообще многопоточность фейковая: потоки могут одновременно читать из внешних ресурсов, а работать одновременно может лишь один поток. Потому в том же пистончике проще наплодить процессов (как это в юниксовом мире часто делали).
Вообще говоря для той задачи, что ты описал (100500 не связаных между собой заданий , которые нужно параллелить на разные ядра) кошерно использовать заточенные под это языки. Ерланг какой-нибудь.
PS: время моё кончилось, прощай
Stertor 16.06.2015 23:20 # 0
aiohttp.request('GET', url)
А что-нибудь посложнее? get, post с параметрами?
>Ну если не нужно синхронизировать их между собой то да, а если нужно?
Выстраивать архитектуру так, чтобы они друг с другом не взаимодействовали. Алсо если у тебя больше 1 потока (тредпул), то тебе и с асинком придется синхронизировать. Судя по твоим рассуждениям эту тему ты толком не знаешь.
>Если речь идет о настоящих потоках (про которые знает ОС, а не про всякие легкие, зеленые итд) то щедулер операционки может и охуеть от переключения контекста. Да и каждый поток все таки тянет за собой структуры в памяти ядра, а она тоже не резиновая.
проксичекер стартовал 400 потоков (было видно в таскменеджере), нагрузки не было видно даже на 3м пне.
>Вообще говоря для той задачи, что ты описал (100500 не связаных между собой заданий , которые нужно параллелить на разные ядра) кошерно использовать заточенные под это языки. Ерланг какой-нибудь.
Я параллеленье на ядра как раз нигде не упоминал, речь шла про проги которые обычно в простое.
Stertor 17.06.2015 02:07 # −1
guest 16.06.2015 20:06 # 0
guest 16.06.2015 20:08 # 0
https://en.wikipedia.org/wiki/JavaScript
JavaScript (/ˈdʒɑːvɑːˌskrɪpt/; JS), also known as ECMAScript (the untrademarked name used for the standard)
guest 16.06.2015 20:15 # 0
guest 16.06.2015 20:20 # 0
Например в node.js DOMа может не быть ввиду отсутствия там HTML, XML и прочих документов.
В современном языке должны быть средства для асинхронного программирования, а в js их нет.
guest 16.06.2015 20:21 # +1
До рождения пауершела за милую душу люди писали скрипты на JS под WSH и через COM общались с виндой. Это (за исключением WMIC) было единственным споосбом что-то наскриптовать на винде не ставя всяких перлов
guest 16.06.2015 20:22 # 0
guest 16.06.2015 19:45 # 0
Хочешь чтобы такое было встроено прямо в язык?
А неймспейсы хочешь?
А нормальный класс-бейзд ООП?
А встроенные в язык загрузчики модулей/классов да еще и с депенденсами транзитивно?
guest 16.06.2015 20:04 # 0
guest 16.06.2015 20:29 # −1
items.forEach(function(item){
// Call asynchronous function, often a save() to DB
item.someAsyncCall();
});
guest 16.06.2015 20:42 # 0