[Time] Name | Message |
[00:31] gpfreitas
|
Can someone point me out to the closest example of the following: two clients, one server. Clients have a pile of integers that they send to the server. Main loop in the server: server gets on integer from client 1, one integer from client 2, adds them, and returns the sum to the clients.
|
[00:32] gpfreitas
|
By closest example, I mean code that is close to the application just described.
|
[00:33] whack
|
gpfreitas: look for examples of REQ/REP sockets
|
[00:34] gpfreitas
|
I tried to do this, but it did not work. Let me post the code:
|
[00:34] whack
|
sounds like you'll have two clients (req) and one server (rep), you'll need read one message each from the clients and reply to both clients at the same time
|
[00:34] whack
|
but I think you will need two rep sockets for that
|
[00:34] gpfreitas
|
Hmmmm... I thought the reply from the server would be a PUB
|
[00:35] whack
|
well, that can work too
|
[00:35] whack
|
it's up to you, clients can send with REQ/REP and receve the real result from a pubsub
|
[00:35] gpfreitas
|
Server code: http://codepad.org/14SBt7Nd
|
[00:36] gpfreitas
|
Clients code: http://codepad.org/nq2nVtbS
|
[00:37] gpfreitas
|
Server code ran fine, I don't know if it works, but it didn't crash.
|
[00:37] gpfreitas
|
Client's code crashed with the following message:
|
[00:37] gpfreitas
|
File "zmqclient.py", line 53, in client1out out_socket2.send(str(d)) File "socket.pyx", line 385, in zmq.core.socket.Socket.send (zmq/core/socket.c:3523) File "socket.pyx", line 438, in zmq.core.socket.Socket._send_copy (zmq/core/socket.c:4054) zmq.core.error.ZMQError: Operation cannot be accomplished in current state
|
[00:39] whack
|
gpfreitas: a few problems; you never send a reply to the request
|
[00:39] gpfreitas
|
Sorry, I know this must be a very newbie question. I'm not a programmer really, I am an economist, and I want to run experiments of my models (like auctions, etc.) at university, and I know Python... I saw a tutorial on ZMQ and it seemed simple enough.
|
[00:39] whack
|
(server)
|
[00:39] gpfreitas
|
(correction: I'm a graduate student in economics)
|
[00:39] gpfreitas
|
Ok, let me see.
|
[00:40] gpfreitas
|
whack: ok. So I should do something like send a reply like "received" to the client, at which point the client sends a new number. Is that all right?
|
[00:40] whack
|
gpfreitas: you have some copy paste errors, too
|
[00:40] whack
|
line 1 def client1out():
|
[00:41] whack
|
should be def client2out(): no?
|
[00:41] gpfreitas
|
Yes. Very sorry about that.
|
[00:41] whack
|
no worries, everybody makes typos :)
|
[00:42] gpfreitas
|
I just feel bad asking someone to "debug" code for me (as simple as it is) for free. So thanks.
|
[00:42] gpfreitas
|
Now,
|
[00:42] gpfreitas
|
when you said, you never send a reply to the request
|
[00:43] whack
|
yeah, req/rep. When you send a request with the client, server receives with a REP socket, you must reply always
|
[00:43] whack
|
even if it's an empty message
|
[00:43] whack
|
but that's a bug on your server, not the client, still reading your client code to see why it's crashing
|
[00:43] whack
|
oooh
|
[00:43] gpfreitas
|
Ok. I'll get back to that later.
|
[00:43] whack
|
hah yeah, what I said.
|
[00:43] whack
|
your data array has 5 elements
|
[00:43] gpfreitas
|
The lack of reply?
|
[00:43] whack
|
yeah
|
[00:44] whack
|
your server can just reply "OK" or something silly, have your client receive and drop the reply
|
[00:44] gpfreitas
|
That's the state thing that it is complaining about.
|
[00:44] whack
|
yup!
|
[00:44] gpfreitas
|
I see.
|
[00:44] whack
|
you are essentially doing two sends in a row on the same socket without processing a reply
|
[00:44] whack
|
and req/rep requires a request and reply each :)
|
[00:44] whack
|
hope this helps
|
[00:44] gpfreitas
|
thanks man
|
[00:45] gpfreitas
|
and an empty message is an empty string, or just nothing at all
|
[00:45] gpfreitas
|
like
|
[00:45] gpfreitas
|
socket.send('')
|
[00:45] gpfreitas
|
or socket.send()
|
[00:45] gpfreitas
|
?
|
[00:45] whack
|
I'd try empty string first
|
[00:45] whack
|
''
|
[00:45] gpfreitas
|
Ok.
|
[00:45] gpfreitas
|
If you don't mind, I'll ask some other questions!
|
[00:45] gpfreitas
|
:)
|
[00:45] whack
|
go ahead :)
|
[00:45] gpfreitas
|
Is it possible to send Python objects, instead of strings?
|
[00:46] gpfreitas
|
Well, that's probably a bad idea anyway. Better to send some representation of the object, right?
|
[00:46] whack
|
I believe you'll have to serialize it somehow
|
[00:46] gpfreitas
|
(For portability reasons, I guess.)
|
[00:46] gpfreitas
|
Ok.
|
[00:47] whack
|
well, if it's always python to python
|
[00:47] gpfreitas
|
JSON, YAML, something.
|
[00:47] whack
|
you can use python's marshal feature
|
[00:47] gpfreitas
|
marshal?
|
[00:47] gpfreitas
|
Ok, I'll check that
|
[00:47] whack
|
gpfreitas: yeah json or yaml will also suffice
|
[00:47] whack
|
http://docs.python.org/library/marshal.html
|
[00:47] gpfreitas
|
whack, thanks a lot.
|
[00:47] gpfreitas
|
Really.
|
[00:47] gpfreitas
|
I have found one nice pyzmq tutorial
|
[00:47] gpfreitas
|
and the examples in the zmq trunk, and the pyzmq trunk
|
[00:48] gpfreitas
|
(the nice tutorial was http://nichol.as/zeromq-an-introduction . This actually made me want to learn the thing.)
|
[00:48] whack
|
gpfreitas: yeah, marshal.dumps(some object) and send the resulting string; then marshal.loads(message) to load it up
|
[00:48] gpfreitas
|
whack: cool!
|
[00:48] gpfreitas
|
thanks again man.
|
[00:48] gpfreitas
|
Back to docs
|
[00:48] gpfreitas
|
the examples in the zmq and pyzmq trunks don't have a lot of comments
|
[00:48] gpfreitas
|
so they are not as helpful as they can be. Still very helpful, but, anyway.
|
[00:48] whack
|
nod. The ZMQ guide is pretty good about explaining how/why/what to do with zeromq
|
[00:49] gpfreitas
|
Ok. I'll check that.
|
[00:49] whack
|
most of the guide has examples in C, but the concepts are universal
|
[00:49] gpfreitas
|
Ok.
|
[00:49] whack
|
http://zguide.zeromq.org/page:all <-- guide
|
[00:49] whack
|
good luck :)
|
[00:49] gpfreitas
|
Thanks again.
|
[00:49] gpfreitas
|
I might come back to bother you guys again!
|
[00:49] gpfreitas
|
So far, I really like the simplicity of the whole thing, and I know I'm just scratching the surface.
|
[00:49] whack
|
soon you'll be conquering economic models before you know it
|
[00:49] gpfreitas
|
Haha
|
[00:50] whack
|
I was an econ minor :)
|
[00:50] gpfreitas
|
It's really cool to be able to implement an abstract concept like that of a "economic mechanism" in a bunch of server/clients... Really, really cool.
|
[00:50] gpfreitas
|
Cool.
|
[00:50] whack
|
the one econ class I wanted to take extra before graduation was game theory, but it was always over-full
|
[00:50] gpfreitas
|
Ah, pity.
|
[00:50] gpfreitas
|
It's really cool.
|
[00:51] whack
|
nod, I studied it briefly on my own; took labor and a bunch of other ones, too
|
[00:51] gpfreitas
|
I don't know labor econ at all. My field is mainly "reverse game theory" (mechanism design).
|
[00:51] gpfreitas
|
We design games so that the equilibria are what we want to happen.
|
[00:52] whack
|
cool :)
|
[00:52] gpfreitas
|
These games can be implemented in real life through things like ZMQ.
|
[00:52] gpfreitas
|
Like an auction.
|
[00:52] gpfreitas
|
Or a voting procedure.
|
[00:52] gpfreitas
|
Or a market.
|
[00:53] gpfreitas
|
And if I can implement these things quickly, then I don't have to rely on the programmers here, that are always so busy (and of course, the professors have priority over us when it comes to their time)
|
[00:53] gpfreitas
|
All right. whack, thanks once more. You are very helpful, man.
|
[00:53] gpfreitas
|
Take care.
|
[00:53] whack
|
later :)
|
[01:01] gpfreitas
|
whack: you still there?
|
[01:01] gpfreitas
|
New server code http://codepad.org/ttCkwfKA did not work. You can see I added the empty messages.
|
[01:01] whack
|
checking
|
[01:02] whack
|
did you update your clients to receive as well?
|
[01:02] gpfreitas
|
(client code, again: http://codepad.org/aV9zY1OY)
|
[01:02] gpfreitas
|
Oh.
|
[01:02] whack
|
you have this:
|
[01:02] whack
|
out_socket1.send(str(d))
|
[01:02] gpfreitas
|
I suppose they do not receive things automatically. :|
|
[01:02] whack
|
but need to out_socket1.recv() or whatnot :)
|
[01:02] gpfreitas
|
Gosh. Sorry.
|
[01:02] whack
|
no worries
|
[01:02] gpfreitas
|
Thanks, gain man.
|
[01:03] gpfreitas
|
again
|
[01:03] whack
|
this particular model *might* fit best without req/rep
|
[01:03] gpfreitas
|
how would the clients send the result then?
|
[01:03] whack
|
pubsub from client->server would fit your model, maybe; depending on where you are taking this program
|
[01:04] gpfreitas
|
I mean, in general, the model I have in mind is: each client `i` sends a message `m_i` and server applies a function `f` on `(m_1, ..., m_n)` obtaining a result `r` that it broadcasts to all the clients.
|
[01:05] whack
|
nod, what you have now (assuming you handle empty replies and such) is fine; alternately you can have each client publish m_i with pubsub
|
[01:05] whack
|
totally your call; try both and maybe see what fits you better
|
[01:08] gpfreitas
|
pubsub does not require this "you need to reply" bureaucracy?
|
[01:09] whack
|
yup
|
[01:09] whack
|
your clients would simply send each number (publish) to the server
|
[01:09] whack
|
and server would pull one message from each client (like it does now), do some computation, then publish result to all clients
|
[01:09] gpfreitas
|
Ok. That's better.
|
[01:09] gpfreitas
|
I'll try that.
|
[01:10] whack
|
you'll still need one 'sub' on the server per client
|
[01:10] whack
|
just so you can identify which messages are from what client
|
[01:10] gpfreitas
|
yeah
|
[01:11] gpfreitas
|
whack: well, thank you very much. Again!
|
[01:11] gpfreitas
|
I'll work on this later. Need to go to a meeting. Thanks, whack.
|
[01:11] gpfreitas
|
See you later!
|
[01:11] whack
|
later :)
|
[02:10] xristos
|
does zmq use select or epoll internally?
|
[02:10] xristos
|
i'm hitting the select fd > 1024 issue
|
[02:11] whack
|
xristos: strace will show you
|
[02:16] xristos
|
well it shouldn't matter, the question is why is it having issues with > fds open
|
[02:16] xristos
|
*1024
|
[02:40] Silly
|
I thought 1024 was a limitation of the linux kernel from the last time I looked into opening more than that...
|
[02:40] Silly
|
maybe I just had a weird system...
|
[02:52] reuben
|
Silly, it is, you can change that limit
|
[02:52] reuben
|
xristos, ^
|
[03:08] xristos
|
reuben: you mean FD_SETSIZE?
|
[03:09] xristos
|
that needs kernel recompilation
|
[03:23] reuben
|
xristos, nono, it's a runtime configuration
|
[03:24] reuben
|
xristos, /etc/sysctl.conf
|
[03:24] reuben
|
fs.file-max
|
[03:26] xristos
|
i have that changed to 500k
|
[03:26] reuben
|
xristos, or just ulimit -n NUM
|
[03:26] reuben
|
on bash
|
[03:26] xristos
|
ulimit -n
|
[03:26] xristos
|
is 1 100k
|
[03:26] xristos
|
so thats not it
|
[03:27] xristos
|
if zeromq is using select then it's a known problem
|
[03:27] xristos
|
i call zmq_poll
|
[03:27] xristos
|
don't know what that does underneath
|
[03:28] xristos
|
but the way it manifests is i have a pull socket
|
[03:28] xristos
|
> 1024 clients connect and do push
|
[03:28] xristos
|
and i've called poll
|
[03:29] xristos
|
well actually it's more like 500 clients
|
[03:29] xristos
|
so one client connection uses more than 1 fd
|
[03:51] sustrik
|
xristos: what OS are you on?
|
[03:51] sustrik
|
select is being used only for windows and openvms iirc
|
[03:52] xristos
|
linux 2.6
|
[03:52] sustrik
|
hm
|
[03:52] sustrik
|
what's the actual assert?
|
[03:54] xristos
|
dont have it right now, i'm at home
|
[03:55] sustrik
|
write an email to the list later on then
|
[03:55] sustrik
|
or fill in a bug report
|
[03:55] sustrik
|
with test program attached
|
[03:55] xristos
|
i'll ask here tomorrow
|
[03:55] xristos
|
from work
|
[03:56] sustrik
|
ok
|
[07:33] minsa
|
I am reading the zmq internal paper.
|
[07:33] minsa
|
when objects inside an I/O threads register a file descriptor, does it use the poller_t in the io_thread_t ?
|
[07:34] minsa
|
I know that poller_t in the io_thread_t receives commands from other threads.
|
[07:35] minsa
|
but I wasn't sure whether that is the same poller_t used for the file descriptors from the objects inside that I/O thread.
|
[08:28] sustrik
|
minsa: yes, it's the same poller
|
[10:28] pieter_hintjens
|
sustrik: hi
|
[10:29] pieter_hintjens
|
just doing some tests on 3.0...
|
[10:29] sustrik
|
morning
|
[10:29] sustrik
|
any problems?
|
[10:29] pieter_hintjens
|
getsockopt doesn't seem to return consistent results in some cases
|
[10:29] pieter_hintjens
|
if I set the rcvhwm on a dealer socket and then try to get it back that works
|
[10:30] pieter_hintjens
|
if I do the same on a sub socket, it doesn't work
|
[10:30] pieter_hintjens
|
if I set affinity and try to get it back I don't get the same value back
|
[10:30] pieter_hintjens
|
this used to work in 3.0, something's changed
|
[10:31] sustrik
|
strange
|
[10:31] sustrik
|
do you have a test program?
|
[10:32] pieter_hintjens
|
it's in czmq but I can make a plain one, sure
|
[10:32] pieter_hintjens
|
30 secs...
|
[10:39] pieter_hintjens
|
sustrik: minimal test case is here: https://gist.github.com/1077756
|
[10:39] sustrik
|
let me see
|
[10:41] sustrik
|
pieter_hintjens: works ok here
|
[10:41] sustrik
|
what computer is that on?
|
[10:41] sustrik
|
32bit one?
|
[10:41] pieter_hintjens
|
ubuntu
|
[10:41] pieter_hintjens
|
64-bit one
|
[10:41] sustrik
|
hm, same here
|
[10:41] pieter_hintjens
|
it returns zero
|
[10:42] pieter_hintjens
|
i'll do some more checking... just built & installed 3.0 from master
|
[10:42] sustrik
|
testing on master as well...
|
[10:43] sustrik
|
does getsockopt succeed??
|
[10:43] sustrik
|
the result is not checked
|
[10:43] pieter_hintjens
|
have checked that, getsockopt succeeds fine
|
[10:43] sustrik
|
hm
|
[10:44] pieter_hintjens
|
I'll debug it, can't be so difficult
|
[10:44] sustrik
|
ok
|
[10:47] pieter_hintjens
|
sustrik: it never seems to call getsockopt (in options.cpp) at all
|
[10:47] pieter_hintjens
|
sorry
|
[10:47] sustrik
|
just step into the function
|
[10:47] pieter_hintjens
|
I meant, it never calls setsockopt
|
[10:48] pieter_hintjens
|
it does call getsockopt and the value is (still) zero
|
[10:48] sustrik
|
zmq_setsocopt?
|
[10:48] pieter_hintjens
|
int zmq::options_t::setsockopt
|
[10:48] pieter_hintjens
|
that is never called
|
[10:48] sustrik
|
try stepping inside the function
|
[10:48] sustrik
|
in gdb
|
[10:48] pieter_hintjens
|
ok
|
[10:48] sustrik
|
it should look like this:
|
[10:49] sustrik
|
zmq_setsockopt()
|
[10:49] sustrik
|
zmq::socket_t::setsockopt()
|
[10:49] sustrik
|
zmq::options_t::setsockopt()
|
[10:49] pieter_hintjens
|
agh, doorbell & meeting, will have to continue later
|
[10:51] sustrik
|
cya
|
[11:02] sustrik
|
pieter_hintjens: found the proble
|
[11:03] sustrik
|
let me fix it
|
[11:07] CIA-32
|
libzmq: 03Martin Sustrik 07master * r57c1342 10/ src/sub.cpp : Bug with setting options on SUB socket fixed ...
|
[11:11] sustrik
|
done
|
[11:29] mpales
|
just a quick question about REP sockets
|
[11:30] mpales
|
i bind one, start polling and receive an event right away, although no REQ is connected yet
|
[11:30] mpales
|
is it ok?
|
[11:31] mpales
|
recv on the socket then blocks
|
[11:32] sustrik
|
mpales: no
|
[11:32] reuben
|
no, that's not ok...
|
[11:32] sustrik
|
it's a bug
|
[11:33] sustrik
|
mpales: what version of 0mq is that?
|
[11:56] mpales
|
sustrik: it's 2.1.7
|
[12:20] sustrik
|
ok, let me try
|
[12:20] sustrik
|
mpalse: ah, btw, what event is that?
|
[12:20] sustrik
|
POLLOUT
|
[12:20] sustrik
|
?
|
[12:20] sustrik
|
that should be ok
|
[12:28] mpales
|
it's POLLIN
|
[12:29] mpales
|
i use a normal system select on socket's fd
|
[12:29] mpales
|
not zmq::poll
|
[13:15] pieter_hintjens
|
re
|
[13:16] sustrik
|
pieter_hintjens: the problem is fixed
|
[13:16] sustrik
|
try the new version
|
[13:16] pieter_hintjens
|
sustrik: yes, saw that, will retest now... thanks!
|
[13:19] pieter_hintjens
|
sustrik: fix confirmed, thanks!
|
[13:27] pieter_hintjens
|
sustrik: question, why is ZMQ_AFFINITY a uint64_t?
|
[13:42] sustrik
|
pieter_hintjens: it's the biggest interger type availble
|
[13:42] sustrik
|
should be a bitmap of course
|
[13:42] sustrik
|
TODO
|
[13:42] pieter_hintjens
|
sustrik: ah, bitmap
|
[13:43] pieter_hintjens
|
stupid of me, I missed that, but eventually it should be a blob, yes
|
[13:43] pieter_hintjens
|
also MAXMSGSIZE might better be an int
|
[13:43] sustrik
|
yeah, the API is capable of that
|
[13:43] sustrik
|
but the implementation is lousy
|
[13:44] pieter_hintjens
|
perhaps just an 8-byte blob?
|
[13:44] sustrik
|
random sized blob
|
[13:44] sustrik
|
not a big problem
|
[13:44] pieter_hintjens
|
later then
|
[13:44] sustrik
|
yes
|
[13:44] pieter_hintjens
|
I'm removing the debian packaging as mato requested
|
[13:44] sustrik
|
sure
|
[13:44] pieter_hintjens
|
ok
|
[14:13] pieter_hintjens
|
zeromq/3.0.0 has been officially packaged & released
|
[14:13] pieter_hintjens
|
go break it, guys!
|
[14:15] mikko
|
as a stable?
|
[14:16] pieter_hintjens
|
heh, sure
|
[14:16] pieter_hintjens
|
I spent all night writing comprehensive test ... oh, hang on, that was a dream
|
[14:16] pieter_hintjens
|
no mikko, as unstable...
|
[14:17] pieter_hintjens
|
mikko: you'll be real happy to know I cloned the repo again
|
[14:55] sustrik
|
pieter_hintjens: you should announce it on zeromq-dev as well
|
[14:56] pieter_hintjens
|
sustrik: did that
|
[14:56] pieter_hintjens
|
did the email not show up?
|
[14:56] sustrik
|
ah, there it is
|
[14:56] sustrik
|
sorry, missed it
|
[14:56] pieterh
|
its pretty simple, the packaging process...
|
[14:56] pieterh
|
one thing we might do, remove the old tags from master
|
[14:57] sustrik
|
you mean pre 2-1?
|
[14:57] pieterh
|
yes
|
[14:57] sustrik
|
they should be *somewhere*
|
[14:57] sustrik
|
given there's no 2-9
|
[14:57] sustrik
|
2=0
|
[14:57] pieterh
|
they're in the zeromq2-0 repo
|
[14:57] sustrik
|
i see
|
[14:57] sustrik
|
no idea how to remove them though
|
[14:57] pieterh
|
https://github.com/zeromq/zeromq2-0
|
[14:57] pieterh
|
all there
|
[14:57] pieterh
|
well, I'll remove them if you approve
|
[14:58] sustrik
|
sure, go on
|
[14:58] pieterh
|
great, that'll help, there's always this risk now of fetching all the tags by mistake
|
[14:59] pieterh
|
a|i: yes, afaik
|
[14:59] pieterh
|
there are a lot of Lua examples in the Guide
|
[14:59] pieterh
|
including examples of polling (which is what you want)
|
[15:00] pieterh
|
search for poll
|
[15:00] pieterh
|
it applies to sub sockets as well as other types
|
[15:04] pieterh
|
a|i: poll works by waiting for a socket to be ready (for input, or output as you specify), then telling you
|
[15:05] pieterh
|
sustrik: done, removed, the tags will remain in cloned copies of the repo until manually deleted there
|
[15:05] pieterh
|
a|i: the question makes little sense... please read the Guide a little more...
|
[15:06] sustrik
|
pieterh: thanks
|
[15:06] sustrik
|
any idea how to remove outdated topic branches btw?
|
[15:06] pieterh
|
a|i: it's not a coroutine, your thread is suspended until there's activity for it to work on
|
[15:06] pieterh
|
sustrik: kind of the same, you remove locally and/or remotely as separate operations
|
[15:07] pieterh
|
a|i: yes... but if you read the Guide as I suggest you would know all this
|
[15:07] pieterh
|
sustrik: to delete a remote branch is the same as deleting a remote tag, you push 'nothing' to it...
|
[15:08] pieterh
|
git push origin :branchname
|
[15:08] sustrik
|
ok, let me try
|
[15:08] pieterh
|
to delete a local branch, git branch -d branchname
|
[15:10] sustrik
|
works!
|
[15:10] pieterh
|
:-)
|
[15:11] pieterh
|
yes, much cleaner now
|
[15:11] pieterh
|
we can delete the maint branch too IMO
|
[15:11] pieterh
|
it's not used, not maintained
|
[15:11] sustrik
|
true
|
[15:12] sustrik
|
done
|
[15:12] pieterh
|
i really like this process we're using, it's light and simple
|
[15:54] sustrik
|
mpales: still there?
|
[15:54] sustrik
|
i've created following test program:
|
[15:54] sustrik
|
https://gist.github.com/1078259
|
[15:54] sustrik
|
it seems to work ok
|
[15:54] sustrik
|
can you give it a try?
|
[19:42] fintler
|
does anyone know of anyone doing a compare and contrast of zeromq to mrnet?
|
[19:43] fintler
|
or anyone using zeromq in HPC for that matter?
|
[19:46] fintler
|
on another note, the zeromq examples kick ass
|
[19:46] fintler
|
amazing work
|
[21:46] mikko
|
pieterh: here?
|
[22:05] mikko
|
or sustrik
|
[23:59] smanek
|
hi there. I have a a server which creates a 0mq PUB socket, and several clients connect to the socket. Things work well, but well for the first few minutes, but then all the clients stop seeing any messages (even though the server logs show that it is 'sending' them over the socket). Both the server and clients are using pyzmq. Any ideas?
|