Skip to content

Instantly share code, notes, and snippets.

@edwardgeorge
Created April 5, 2013 22:34
Show Gist options
  • Save edwardgeorge/5323231 to your computer and use it in GitHub Desktop.
Save edwardgeorge/5323231 to your computer and use it in GitHub Desktop.
demonstration of deadlock with eventlet.green.subprocess on python 2.7
import os
import sys
import tempfile
import eventlet
from eventlet.green import subprocess
sock = eventlet.listen(('127.0.0.1', 0))
port = sock.getsockname()[1]
def handler(sock, addr):
while True:
d = sock.recv(4096)
if not d:
break
sock.sendall(d)
sock.close()
def server():
eventlet.serve(sock, handler)
eventlet.spawn(server)
if __name__ == '__main__':
modpath = os.path.join(tempfile.mkdtemp('_t'), 'foo.py')
modcontents = """
import random
import socket
import sys
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('127.0.0.1', %d))
def randbytes(numbytes):
return ''.join(chr(random.getrandbits(8)) for i in xrange(numbytes))
for i in xrange(1000):
dout = randbytes(256)
sock.sendall(dout)
assert sock.recv(4096) == dout
sys.stderr.write(randbytes(256))
sys.stdout.write(randbytes(256))
""" % (port, )
with open(modpath, 'w') as f:
f.write(modcontents)
devnull = open(os.devnull, 'wb')
p = subprocess.Popen([sys.executable, modpath],
#stdout=devnull,
#stderr=devnull)
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
p.communicate()
print p.returncode
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment