Twisted reactor 'signal only works in main thread' error?

Richard richardd at hmgcc.gov.uk
Thu Jun 5 11:52:51 CEST 2003


Hi,

I am using execfile inside a Thread derived class to run another Python
script. The source for this script is below. The problem is, when I try to
run it I get the following error message:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Python22\lib\threading.py", line 408, in __bootstrap
    self.run()
  File "T:\code\python\TestServer.py", line 25, in run
    execfile(self.m_File, self.m_ScriptVars)
  File "URFParser.py", line 37, in ?
    m_URFServer.start()
  File "URFParser.py", line 32, in start
    reactor.run()
  File "C:\Python22\Lib\site-packages\twisted\internet\default.py", line
122, in
 run
    self.startRunning(installSignalHandlers=installSignalHandlers)
  File "C:\Python22\Lib\site-packages\twisted\internet\default.py", line
116, in
 startRunning
    self._handleSignals()
  File "C:\Python22\Lib\site-packages\twisted\internet\default.py", line 88,
in
_handleSignals
    signal.signal(signal.SIGINT, self.sigInt)
ValueError: signal only works in main thread

####

I've had a look at the Twisted docs but am only very new to Twisted and so
can't really figure out how to fix this, am I right in thinking that a
reactor can only operate inside the main thread of a program due to some
signalling it uses? If so, is there any way around it?

The source for TestServer.py is here:

####

from twisted.internet.protocol import Protocol, ServerFactory
from twisted.internet import reactor

class ConnectionEndpoint(Protocol):

 def connectionMade(self):
  #Executed in a new thread for every incoming connection
  self.transport.write(self.factory.m_TestString)

 def dataReceived(self, data):
  print data

class ConnectionEndpointFactory(ServerFactory):
 protocol = ConnectionEndpoint
 m_FrameQueue = None
 m_TestString = "Test"

 def setQ(self, q):
  self.m_FrameQueue = q


class URFServer:
 m_Address = []
 m_Factory = ConnectionEndpointFactory()

 def __init__(self, q, address):
  self.m_Factory.setQ(q)
  self.m_Address = address

 def start(self):
  reactor.listenTCP(int(self.m_Address[1]), self.m_Factory)
  reactor.run()


#main
m_URFServer = URFServer(frameQueue, address)
m_URFServer.start()


#####

TIA

Richard







More information about the Python-list mailing list