I'd be willing to try it but one such problem with this approach is that
I need to have a very high throughput of commands sent through this
pipe, and they are run interactively (waiting for it's return result) so
I wonder if a queue solution in a seperate thread is really going to
work well enough. The connection handles database queries as well as a
variety of other tasks, you can think of aolserver as being an
application layer on top of another server which is doing all the real
work, and I need to communicate with that server. I have found that
multiple connections is fine, so at least I don't have to do it all
through one connection.
Did anyone look at the nsproxy email I sent the other day, and manage to
duplicate my problems?
Rusty
Jeff Rogers wrote:
Rusty Brooks wrote:
Actually I can already think of a lot more uses of this. I've been
using AOLServer since back in the day when you could share file
handles between threads. This made logging much simpler because you
could initialize logs on server startup and write to them any time.
When it moved to multiple interps that did not share file handles, we
had to start doing stuff like queueing file writes to nsvs and
flushing those periodically, or opening a file EVERY TIME you wanted
to write to it, and wrapping that in mutexes. Either way, kind of a
pain... This might enable certain things like that again.
If nsproxy solves your problem, great. If not, here's a different
thought - if I was doing this in a vanilla threaded tclsh with the
standard thread package, I would simply create one worker thread to
handle the logging task and just send that thread messages with
thread::send. AOLserver doesn't have that interface, but you can put
together something similar fairly simply. It is similar to what you
were doing with queuing the file writes to nsvs, but rather than doing
a periodic flush explicitly, have a separate thread that waits on a
condition to be notified that there is something new to do and
immediately wakes up to process that message.
Generically:
proc startworker {name} {
nsv_set $name mutex [ns_mutex create]
nsv_set $name cond [ns_cond create]
nsv_set $name queue {}
nsv_set $name tid [ns_thread begindetached [list workermain $name]]
}
proc workermain {name} {
while(1) {
ns_cond wait [nsv_get $name cond] [nsv_get $name mutex]
set queue [nsv_get $name queue]
nsv_set $name queue [lrange $queue 1 end]
set msg [lindex $queue 0]
eval $msg
# or whatever else you want to do with these messages
}
}
prod sendworker {name msg} {
nsv_lappend $name $msg
ns_conn broadcast [nsv_get $name $cond]
}
startworker logger
sendworker logger {set logfh [open logfile w]}
sendworker logger {puts $logfh msg1}
sendworker logget {puts $logfh msg2}
etc.
-J
--
AOLserver - http://www.aolserver.com/
To Remove yourself from this list, simply send an email to
<[EMAIL PROTECTED]> with the
body of "SIGNOFF AOLSERVER" in the email message. You can leave the
Subject: field of your email blank.
--
AOLserver - http://www.aolserver.com/
To Remove yourself from this list, simply send an email to <[EMAIL PROTECTED]>
with the
body of "SIGNOFF AOLSERVER" in the email message. You can leave the Subject:
field of your email blank.