Skip to content

Instantly share code, notes, and snippets.

@tmc
Created January 12, 2011 16:12
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save tmc/776364 to your computer and use it in GitHub Desktop.
Save tmc/776364 to your computer and use it in GitHub Desktop.
simple multiprocessing gevent echo server
import sys
from gevent import server
from multiprocessing import Process, current_process, cpu_count
def note(format, *args):
sys.stderr.write('[%s]\t%s\n' % (current_process().name, format%args))
def echo(socket, address):
print 'New connection from %s:%s' % address
fileobj = socket.makefile()
fileobj.write('Welcome to the echo server! Type quit to exit.\r\n')
fileobj.write('In %s\r\n' % current_process().name)
fileobj.flush()
while True:
line = fileobj.readline()
if not line:
print "client disconnected"
break
if line.strip().lower() == 'quit':
print "client quit"
break
fileobj.write(current_process().name + '\t' + line)
fileobj.flush()
print "echoed", repr(line)
s = server.StreamServer(('127.0.0.1', 8001), echo)
s.pre_start()
def serve_forever(server):
note('starting server')
try:
server.start_accepting()
try:
server._stopped_event.wait()
except:
raise
except KeyboardInterrupt:
pass
number_of_processes = cpu_count() - 1
print 'Starting %s processes' % number_of_processes
for i in range(number_of_processes):
Process(target=serve_forever, args=(s,)).start()
s.serve_forever()
@freewindwu
Copy link

Hi, traviscline,

When I download and run it on my server, I got this Exception:
~/python $ python gistfile1.py

Starting 3 processes
[Process-1]     starting server
[Process-2]     starting server
Process Process-2:
Traceback (most recent call last):
  File "/usr/lib64/python2.6/multiprocessing/process.py", line 232, in _bootstrap
[Process-3]     starting server
    self.run()
Traceback (most recent call last):
  File "/usr/lib64/python2.6/multiprocessing/process.py", line 88, in run
  File "gistfile1.py", line 46, in 
    self._target(*self._args, **self._kwargs)
    s.serve_forever()
  File "gistfile1.py", line 33, in serve_forever
  File "/usr/lib64/python2.6/site-packages/gevent-0.13.1-py2.6-linux-x86_64.egg/gevent/baseserver.py", line 178, in serve_forever
    self.start()
    server.start_accepting()
  File "/usr/lib64/python2.6/site-packages/gevent-0.13.1-py2.6-linux-x86_64.egg/gevent/baseserver.py", line 142, in start
  File "/usr/lib64/python2.6/site-packages/gevent-0.13.1-py2.6-linux-x86_64.egg/gevent/server.py", line 91, in start_accepting
    self.start_accepting()
  File "/usr/lib64/python2.6/site-packages/gevent-0.13.1-py2.6-linux-x86_64.egg/gevent/server.py", line 91, in start_accepting
Process Process-3:
    self._accept_event = core.read_event(self.socket.fileno(), self._do_accept, persist=True)
Traceback (most recent call last):
  File "core.pyx", line 331, in gevent.core.read_event.__init__ (gevent/core.c:3912)
    self._accept_event = core.read_event(self.socket.fileno(), self._do_accept, persist=True)
  File "core.pyx", line 331, in gevent.core.read_event.__init__ (gevent/core.c:3912)
  File "/usr/lib64/python2.6/multiprocessing/process.py", line 232, in _bootstrap
  File "core.pyx", line 277, in gevent.core.event.add (gevent/core.c:3049)
    self.run()
IOError:   File "/usr/lib64/python2.6/multiprocessing/process.py", line 88, in run
event_add(fileno=3) returned -1
    self._target(*self._args, **self._kwargs)
  File "gistfile1.py", line 33, in serve_forever
    server.start_accepting()
  File "/usr/lib64/python2.6/site-packages/gevent-0.13.1-py2.6-linux-x86_64.egg/gevent/server.py", line 91, in start_accepting
    self._accept_event = core.read_event(self.socket.fileno(), self._do_accept, persist=True)
  File "core.pyx", line 331, in gevent.core.read_event.__init__ (gevent/core.c:3912)
  File "core.pyx", line 277, in gevent.core.event.add (gevent/core.c:3049)
IOError: event_add(fileno=3) returned -1
  File "core.pyx", line 277, in gevent.core.event.add (gevent/core.c:3049)
IOError: event_add(fileno=3) returned -1

My enviroment is Gentoo Linux for x64, Python 2.6.6, Gevent 0.13.1

freewindwu

@tmc
Copy link
Author

tmc commented Jan 21, 2011

Sorry. Should have pointed out that I was using gevent tip. Haven't tracked down the revision but this was fixed since 0.13

@notedit
Copy link

notedit commented Aug 24, 2011

hi traviscline when i run your code i came to this error

Process Process-1:
Traceback (most recent call last):
  File "/usr/lib/python2.6/multiprocessing/process.py", line 232, in _bootstrap
    self.run()
  File "/usr/lib/python2.6/multiprocessing/process.py", line 88, in run
    self._target(*self._args, **self._kwargs)
  File "gistfile1.py", line 33, in serve_forever
    server.start_accepting()
  File "build/bdist.linux-i686/egg/gevent/server.py", line 99, in start_accepting
    self._accept_event = core.read_event(self.socket.fileno(), self._do_accept, persist=True)
  File "core.pyx", line 308, in gevent.core.read_event.__init__ (gevent/core.c:3960)
  File "core.pyx", line 252, in gevent.core.event.add (gevent/core.c:2952)
IOError: [Errno 17] File exists

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment