 
			
				02.08.2011, 12:57
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.08.2011 
					
					
					
						Сообщений: 8
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Асинхронный вызов толстых функций
			 
			
		
		
		
		Ситуация следующая. 
 
Конкретизированный ситуация: 
 
Есть массив обьектов. Есть функция в параметрах которой - элемент этого массива. Сам элемент есть некий обьект «config», который определяет как именно функция будет выполняться. 
 
Хотелось бы выполнять функции параллельно, так как выполнение одной - достаточно тяжелый процесс и их результаты друг на друг абсолютно не влияют. 
 
Более общая форма: 
 
Есть: 
function func(param){...} 
 
Хочу: 
func(obj_1); 
func(obj_2); 
... 
func(obj_20) 
 
И чтоб вторая функция начала выполняться не ожидая окончания первой. Ну и т.д. 
 
Буду благодарен за напутствующее слово) 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				02.08.2011, 13:00
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 х.з 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 21.11.2010 
					
					
					
						Сообщений: 4,588
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Rogov Dmitry
			
		
	 | 
 
	
		Хотелось бы выполнять функции параллельно, так как выполнение одной - достаточно тяжелый процесс и их результаты друг на друг абсолютно не влияют.....И чтоб вторая функция начала выполняться не ожидая окончания первой. Ну и т.д. 
	 | 
 
	
 
  никак  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось dmitriymar, 02.08.2011 в 13:02.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				02.08.2011, 13:04
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.08.2011 
					
					
					
						Сообщений: 8
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		dmitriymar, я зелен на этом поле, поэтому, видимо, сча начну ужасные вещи уточнять. 
Механизм ивентов и хмльхттпРеквест позволяют не ожидать окончания, а идти программе дальше.
 
Если бы каждый вызов func(obj_i) начал выполнятся как онклик ивент, а юзер бы раз 20 кликнул очень быстро в 20 нужных местах - всё выполнилось так как мне надо    
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				02.08.2011, 13:10
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 х.з 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 21.11.2010 
					
					
					
						Сообщений: 4,588
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Rogov Dmitry
			
		
	 | 
 
	| 
		Механизм ивентов и хмльхттпРеквест позволяют не ожидать окончания, а идти программе дальше.
	 | 
 
	
 
 0 последовательность. отправка запроса-полная отработка начатого выполнение кода+ожидание ответа -обработка ответа,но когда начатый до этого код отработает 
1. как раз работающий код в  момент получения ответа выполнится до конца ,а потом только пойдёт обработка события. 
2. асинхронность связана не с выполнением, а с постановкой в очередь событий,и отсутствием стопора при ожидании ответа. но опять событие вызывающее запрос-сработает только тогда,когда его очередь в очереди подойдёт . 
код выполняется последовательно ,порядок его выполнения определяет очередь. язык однопотоковый  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось dmitriymar, 02.08.2011 в 13:14.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				02.08.2011, 13:14
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 29.06.2011 
					
					
					
						Сообщений: 445
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Если я не ошибаюсь, для этого можно использовать setTimeout. 
Насколько я понимаю, что-то в таком духе:
 
var objects = [obj1, obj2, ..., objN, ...];
for (var i=0; i<object.length; i++) {
    window.setTimeout(function() {
        func(objects[i]);
    }, 1);
}
Но если функции тяжелые и их много, это может застопорить браузер. 
В гугл есть об этом по запросу javascript сalling function asynchronously  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось ваый, 02.08.2011 в 13:16.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				02.08.2011, 13:17
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 х.з 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 21.11.2010 
					
					
					
						Сообщений: 4,588
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от ваый
			
		
	 | 
 
	
		Если я не ошибаюсь, для этого можно использовать setTimeout. 
Насколько я понимаю, что-то в таком духе:
	 | 
 
	
 
 нет-он в очередь поставит. и будут последовательно выполняться. задержка в 1 мс при этом ничего не значит. пока один не отработает таймер второй не начнёт работу и т.д
 http://javascript.ru/tutorial/events...noe-vypolnenie
http://javascript.ru/tutorial/events/timing 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось dmitriymar, 02.08.2011 в 13:19.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				02.08.2011, 13:22
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.08.2011 
					
					
					
						Сообщений: 8
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 dmitriymar, в принципе, меня бы устроило, если бы выполнение функций стало в хитрую очередь и выполнялось бы по частям. Это возможно? 
 
Так же фактически ивенты и выполняются, насколько я себе представляю. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				02.08.2011, 13:25
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 х.з 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 21.11.2010 
					
					
					
						Сообщений: 4,588
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Rogov Dmitry
			
		
	 | 
 
	| 
		в принципе, меня бы устроило, если бы выполнение функций стало в хитрую очередь и выполнялось бы по частям. Это возможно?
	 | 
 
	
 
 см ссылки выше. начатый код выполнится целым -невозможно выполнение по частям.разбить на части и выполнять части(то часть одной ,то часть другой-ну дак это разбитие функции на множество функций)-смысл?  поток один  ,ускорить не возможно выполнение.Можно только замедлить и загрузить лишними действиями  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				02.08.2011, 13:28
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 29.06.2011 
					
					
					
						Сообщений: 445
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от dmitriymar
			
		
	 | 
 
	| 
		нет-он в очередь поставит.
	 | 
 
	
 
 Да ведь в том и дело, что setTimeout это один из известных методов для распараллеливания выполнения процессов, способ обойти однопоточность языка. Вот тут, например, упоминается в статье об web workers  http://www.html5rocks.com/en/tutorials/workers/basics/ (самый первый раздел The Problem: JavaScript Concurrency)
 
Было бы интересно, если бы автор топика провел нехитрые тесты с замером времени выполнения в его случае и с распараллеливанием через setTimeout, и привел их результаты тут.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				02.08.2011, 13:29
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 х.з 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 21.11.2010 
					
					
					
						Сообщений: 4,588
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от ваый
			
		
	 | 
 
	| 
		Да ведь в том и дело, что setTimeout это один из известных методов для распараллеливания выполнения процессов, способ обойти однопоточность языка.
	 | 
 
	
 
 ваый,
  http://javascript.ru/tutorial/events/timing
http://www.html5rocks.com/en/tutorials/workers -хорошая статья.тоже можно и с сервером. 
только вот не для всего подойдёт.если функция должна давать ответ и ничего более, то да.а если функция работает с графикой на странице или другие подобные вещи? 
это должны быть настолько длительные и сложные вычисления чтоб механизм этот был оправдан.а в приложении где разница будет в милисекунды с этим методом и без-смысла нет  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось dmitriymar, 02.08.2011 в 13:47.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |