jath03
jath03

Reputation: 2359

threading.local from a different thread

I'm trying to make a threaded cgi webserver similar to this; however, I'm stuck on how to set local data in the handler for a different thread. Is it possible to set threading.local data, such as a dict, for a thread other than the handler. To be more specific I want to have the request parameters, headers, etc available from a cgi file that was started with subprocess.run. The bottom of the do_GET in this file on github is what I use now, but that can only serve one client at a time. I want to replace this part because I want multiple connections/threads at once, and I need different data in each connection/thread.

Is there a way to edit/set threading.local data from a different thread. Or if there is a better way to achieve what I am trying, please let me know. If you know that this is definently impossible, say so.

Thanks in advance!

Upvotes: 0

Views: 173

Answers (1)

RedBarron
RedBarron

Reputation: 99

Without seeing what test code you have, and knowing what you've tried so far, I can't tell you exactly what you need to succeed. That said, I can tell you that trying to edit information in a threading.local() object from another thread is not the cleanest path to take.

Generally, the best way to send calls to other threads is through threading.Event() objects. Usually, a thread listens to an Event() object and does an action based on that. In this case, I could see having a handler set an event in the case of a GET request.

Then, in the thread that is writing the cgi file, have a function that, when the Event() object is set, records the data you need and unsets the Event() object.

So, in pseudo-code:

import threading

evt = threading.Event()

def noteTaker(evt):
  while True:
    if evt.wait(): 
      modifyDataYouNeed()
      f.open()
      f.write()
      f.close()
      evt.clear()

def do_GET(evt):
  print "so, a query hit your webserver"
  evt.set()
  print "and noteTaker was just called"

So, while I couldn't answer your question directly, I hope this helps some on how threads communicate and will help you infer what you need :)

threading information (as I'm sure you've read already, but for the sake of diligence) is here

Upvotes: 1

Related Questions