Created
April 5, 2013 22:34
-
-
Save edwardgeorge/5323231 to your computer and use it in GitHub Desktop.
demonstration of deadlock with eventlet.green.subprocess on python 2.7
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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