[Ruby] thread or process

Vladimir Shahov v.shahov at sam-solutions.net
Wed May 7 12:35:08 MSD 2003


On Mon, May 05, 2003 at 10:20:10PM +0400, Vladimir Zdorovenco wrote:
> >>>>> "vic" == vic ismakaev <vic> writes:
> 
>     vic> Приветствую!  Возник концептуальный вопрос у меня: под
>     vic> линуксом треды действительно являются полноценными тредами в
>     vic> рамках ОС,или они изолированы в рамках интрепретатора руби?
> 
> Полноценные треды в рамках Ruby. 
Следует читать как "изолированы в рамках интерпретатора". )
Наши дорогие полноценные треды в рамках Ruby блокируются все вместе на раз-два, если в
одном из них вызван syscall, ушедший надолго в пространство ядра.
Ибо (с точки зрения ОС) интерпретатор Ruby - это 1 процесс/поток и
блокировка идет целиком.

Пример из жизни, переброска данных туда-сюда между сокетами. 
На каждое соединение порождается отдельный поток
<!-- начало цитаты -->
  server_io=server.to_io
  client_io=client.to_io
  fdset=[client_io,socket_io]
  loop {
	result=select(fdset) #timeout for later config
	next if result==nil
	
	# if data present in one of sockets
	result[0].each { |sockObject|
	  case sockObject
  	  when client_io
  	  	content=client.sysread(1024)
  		server.syswrite(content)
	  
	  when server_io
	  	content=server.sysread(1024)
	  	client.syswrite(content) 
	  end
	} #each
  } #loop
<!-- конец цитаты -->

server - SSLSocket, client - TCPSocket
так вот, при попытке передать некую пока еще не опознанную
последовательность двоичных данных, server.syswrite вешает намертво всю
программу. До таймаута (через час гдето). Системный вызов write(2)
произведенный в недрах библиотеки ruby-openssl-0.1.3 не возвращает
значения. ОС блокирует выполнение .
ruby 1.8.0-pre2
Debian GNU/Linux

> 
>     vic> И насколько эффективнее использовать треды,а не порождать
>     vic> новые процессы.
> 
> От задачи зависит. Но, но второе поможет избежать неприятностей 
> с select, poll подобными функциями, может еще чего. Также никто не 
> мешает использовать отдельные процэссы там где ruby треды неподходят.
Kernel#select знаю, Kernel#poll - не знаю


-- 
Vladimir Shahov, icq 78193930



More information about the Ruby mailing list