import os
import time
def sleepsort(l):
"""Another dumb sorting algorithm."""
pids = []
def reap():
while pids:
os.waitpid(pids.pop(), 0)
# Setup communication.
startr, startw = os.pipe()
resr, resw = os.pipe()
try:
for i, x in enumerate(l):
pid = os.fork()
if pid == 0:
# Wait for parent process to signal start.
os.read(startr, 1)
time.sleep(x)
# Notify the parent process.
os.write(resw, str(i).encode("ascii") + b" ")
# Goodbye.
os._exit(0)
else:
pids.append(pid)
# Start the sleeps.
os.write(startw, b"x" * len(l))
os.close(startw)
startw = -1
reap()
os.close(resw)
resw = -1
# Read results.
data = []
while True:
d = os.read(resr, 4096)
if len(d) == 0:
break
data.append(d)
finally:
os.close(startr)
if startw > 0:
os.close(startw)
os.close(resr)
if resw > 0:
os.close(resw)
reap()
return [l[int(c)] for c in b"".join(data)[:-1].split(b" ")]
if __name__ == "__main__":
print(sleepsort([10, 9, 7.3, 7, 6, .2, .4, 3, 2, 1.5]))
Diff to Previous Revision
--- revision 1 2011-06-17 02:08:58
+++ revision 2 2011-06-17 02:37:58
@@ -43,7 +43,7 @@
os.close(startw)
os.close(resr)
if resw > 0:
- os.close(resw)
+ os.close(resw)
reap()
return [l[int(c)] for c in b"".join(data)[:-1].split(b" ")]