nonblocking TCPSocket in multithread software.

A

Arto Pastinen

Hi!

Why this blocks?

a =3D Thread.new do
s =3D TCPSocket.new('localhost', 4343)
s.nonblock =3D true
p s.read # it block's here no matter what i do
end
a.join

.. and how to make it nonblock?

It works fine if i drive it in main thread.

Thnx: Artsi
 
A

Arto Pastinen

It seems work if i lock thread.. funny.. :)

a =3D Thread.new do
s =3D TCPSocket.new('localhost', 4343)
s.nonblock =3D true
Thread.critical {
p s.read # it block's here no matter what i do
}
end
a.join

- Artsi
 
A

Arto Pastinen

pah.. now it just dont do nothing..

2005/12/16 said:
It seems work if i lock thread.. funny.. :)

a =3D Thread.new do
s =3D TCPSocket.new('localhost', 4343)
s.nonblock =3D true
Thread.critical {
p s.read # it block's here no matter what i do
}
end
a.join

- Artsi
 
B

Bill Kelly

From: "Arto Pastinen said:


My version of Ruby (1.8.2) doesn't have the #nonblock method.

So I use:

@sock.fcntl(Fcntl::F_SETFL, @sock.fcntl(Fcntl::F_GETFL) | Fcntl::O_NONBLOCK)

Maybe try:

a = Thread.new do
s = TCPSocket.new('localhost', 4343)

s.fcntl(Fcntl::F_SETFL, s.fcntl(Fcntl::F_GETFL) | Fcntl::O_NONBLOCK)
print dat while dat = s.recv(65536)
end

Note that I'm using #recv instead of #read... Maybe this will help?


Hope this helps,

Regards,

Bill
 
Y

Yohanes Santoso

Arto Pastinen said:
Hi!

Why this blocks?

a = Thread.new do
s = TCPSocket.new('localhost', 4343)
s.nonblock = true
p s.read # it block's here no matter what i do

I expect it to block. All IO's buffered I/O methods (puts, prints, read, write,
etc.) are blocking operations.

The utility of nonblock comes if you use unbuffered I/O methods:
sysread, syswrite, recv, send, etc.

YS.
 
T

Tanaka Akira

Yohanes Santoso said:
I expect it to block. All IO's buffered I/O methods (puts, prints, read, write,
etc.) are blocking operations.
Agreed.

The utility of nonblock comes if you use unbuffered I/O methods:
sysread, syswrite, recv, send, etc.

Unfortunately they blocks if there are multiple threads.

Apart from that syswrite (and other unbuffered writing
methods) blocks unless O_NONBLOCK.

Formar problem can be solved by IO.select.
Later problem can be solved by O_NONBLOCK.

I think it is useful that some utility nonblocking methods
to care above issues automatically. However it is quite
difficult to propose method names which matz accept.
 
A

ara.t.howard

I think it is useful that some utility nonblocking methods to care above
issues automatically. However it is quite difficult to propose method names
which matz accept.

i respectfully suggest, to matz, that this should not stand in the way. this
issue has come up too many times to let naming stand in the way. there is
little that an 'alias' might not solve at a later date. something simple,
like prefacing every such io method with 'nb_' would, at the least, be easily
understood, even if inelegant.

kind regards.

-a
--
===============================================================================
| ara [dot] t [dot] howard [at] noaa [dot] gov
| all happiness comes from the desire for others to be happy. all misery
| comes from the desire for oneself to be happy.
| -- bodhicaryavatara
===============================================================================
 
T

Tanaka Akira

i respectfully suggest, to matz, that this should not stand in the way. this
issue has come up too many times to let naming stand in the way. there is
little that an 'alias' might not solve at a later date. something simple,
like prefacing every such io method with 'nb_' would, at the least, be easily
understood, even if inelegant.

matz?
 
A

Arto Pastinen

Hi bill!

I try your example, and well it works little better but it is not what
i search..

I try to implemented multiplexed architecture, and the Thread still
blocks and it is not acceptable, i even cannot see difference if i
remove file descriptor mod line or if i leave it.. btw. i dont know
nothing programming native file descriptors. maby i should read it.

Now, i would like to get clear answer.. is it possible to implement
clean multiplexed socket architecture, like with java.nio?? (yes, i
was java programmer before i found ruby on rails :))

Thanks guys, Artsi
 
T

Tanaka Akira

Arto Pastinen said:
I try to implemented multiplexed architecture, and the Thread still
blocks and it is not acceptable, i even cannot see difference if i
remove file descriptor mod line or if i leave it.. btw. i dont know
nothing programming native file descriptors. maby i should read it.

How do you multiplex I/O? IO.select?

If you use IO.select and call IO#sysread only wnen IO.select
notify readability, it should not block.
 
A

Arto Pastinen

ah.. the magic select.. :)

I tried it some time ago, but i couldnt get it work, i cant remember
maby it was syntax error, i have inspect ruby only couple weeks..
But this was what i have searched. Thank you Tanaka!!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,201
Messages
2,571,048
Members
47,649
Latest member
MargaretCo

Latest Threads

Top