Skip to content

Instantly share code, notes, and snippets.

@sreedom
Created October 27, 2014 09:32
Show Gist options
  • Save sreedom/f1be0c6d54137196487b to your computer and use it in GitHub Desktop.
Save sreedom/f1be0c6d54137196487b to your computer and use it in GitHub Desktop.
celery 3.1 implementation of mergesort
from celery import Celery, chord
app = Celery('tasks', backend='amqp', broker='amqp://')
app.conf.CELERY_RESULT_BACKEND = 'amqp'
def mergesort(list_obj):
'''normal mergesort
'''
if len(list_obj) <= 1:
return list_obj
middle = len(list_obj) / 2
left, right = list_obj[:middle], list_obj[middle:]
return list(merge(list(mergesort(left)), list(mergesort(right))))
def merge(left, right):
'''normal merge
'''
while 1:
if left == []:
for j in right:
yield j
break
elif right == []:
for j in left:
yield j
break
elif left[0] < right[0]:
yield left.pop(0)
else:
yield right.pop(0)
def merge2(left_r, right_r):
'''celery merge
'''
left =left_r.get()
right = right_r.get()
while 1:
if left == []:
for j in right:
yield j
break
elif right == []:
for j in left:
yield j
break
elif left[0] < right[0]:
yield left.pop(0)
else:
yield right.pop(0)
@app.task
def merge_c(in_list):
'''celery merge
'''
#unpack
print '*'*21 + str( in_list)
left, right = in_list
return list(merge2(left, right))
@app.task
def same_object(l_obj):
'''helper function to convert list to `result`
'''
return l_obj
@app.task
def mergesort_c(list_obj):
'''celery mergesort
'''
if len(list_obj) <= 1:
# make sure that you return a `result` object for merge
return same_object.delay(list_obj)
middle = len(list_obj) / 2
left, right = list_obj[:middle], list_obj[middle:]
# finish mergesort (left) and mergesort(right) and merge them
res = chord([mergesort_c.s(left), mergesort_c.s(right)])(merge_c.s())
return res
if __name__ == '__main__':
l = [2,1, 3]
#normal mergesort
print mergesort(l) #[1, 2, 3, 3, 5]
# with celery
res = mergesort_c(l)
print res.get()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment