On 23Nov2015 14:14, Israel Brewster <isr...@ravnalaska.net> wrote:
On Nov 23, 2015, at 1:43 PM, Chris Kaynor <ckay...@zindagigames.com> wrote:
On Mon, Nov 23, 2015 at 2:18 PM, Israel Brewster <isr...@ravnalaska.net>
wrote:
  3. Have an event per thread. This will use less CPU than the second
  option, however does require more memory and OS resources, and so will not
  be viable for huge numbers of threads, though if you hit the limit, you are
  probably using threads wrong.
[...]
While I would agree with #1 in general, the threads, in this case, are CherryPy threads, so I need to get the data and return it to the client in the same function call, which of course means the thread needs to block until the data is ready - it can't return and let the result be processed "later".

Then #3. I would have a common function/method for submitting a request to go to the subprocess, and have that method return an Event on which to wait. Then caller then just waits for the Event and collects the data. Obviously, the method does not just return the Event, but an Event and something to receive the return data. I've got a class called a Result for this kind of thing; make a small class containing an Event and which will have a .result attribute for the return information; the submitting method allocates one of these and returns it. The response handler gets the instance (by looking it up from the tag), sets the .result attribute and fires the Event. Your caller wakes up from waiting on the Event and consults the .result attribute.

Completely untested example code:

 class ReturnEvent:
   def __init__(self):
     self.event = Event()

 seq = 0
 re_by_tag = {}

 def submit_request(query):
   global seq, re_by_tag
   tag = seq
   seq += 1
   RE = ReturnEvent()
   re_by_tag[tag] = RE
   send_request(tag, query)
   return RE

 def process_response(tag, response_data):
   RE = re_by_tag.pop(tag)
   RE.result = response_data
   RE.event.set()

 ... CherryPy request handler ...
 RE = submit_request(your_query_info)
 RE.wait()
 response_data = RE.result

Cheers,
Cameron Simpson <c...@zip.com.au>
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to