天才排序算法:睡眠排序python使用协程实现

在Genius sorting algorithm: Sleep sort中看到这个排序算法,看了原理之后确实让人会心一笑
原理就是为一个长度为n的待排序数组创建一个长度为n的线程向量,将待排序数字作为线程sleep函数的参数,sleep完成后输出数字,那么数字越大sleep时间越长,就排到越后面.
下面贴出python实现.

import asyncio
async def sleepingsort(sec):
    await asyncio.sleep(sec/100000)
    print(sec)
nums = [1,4,7,3,8,9,2,6,5]
loop = asyncio.get_event_loop()
tasks = [sleepingsort(i) for i in nums]
loop.run_until_complete(asyncio.wait(tasks))#仅接收awaitable对象,对协程有兴趣的同学可以了解.了解了awaitable就基本了解协程了.
Out[]:
1
2
3
4
5
6
7
8
9
({<Task finished coro=<sleepingsort() done, defined at @<ipython-input-29-ed6019b1b0fe>:1> result=None>,
  <Task finished coro=<sleepingsort() done, defined at <ipython-input-29-ed6019b1b0fe>:1> result=None>,
  <Task finished coro=<sleepingsort() done, defined at <ipython-input-29-ed6019b1b0fe>:1> result=None>,
  <Task finished coro=<sleepingsort() done, defined at <ipython-input-29-ed6019b1b0fe>:1> result=None>,
  <Task finished coro=<sleepingsort() done, defined at <ipython-input-29-ed6019b1b0fe>:1> result=None>,
  <Task finished coro=<sleepingsort() done, defined at <ipython-input-29-ed6019b1b0fe>:1> result=None>,
  <Task finished coro=<sleepingsort() done, defined at <ipython-input-29-ed6019b1b0fe>:1> result=None>,
  <Task finished coro=<sleepingsort() done, defined at <ipython-input-29-ed6019b1b0fe>:1> result=None>,
  <Task finished coro=<sleepingsort() done, defined at <ipython-input-29-ed6019b1b0fe>:1> result=None>},
 set())

java中对线程天然支持,然而没想到传说中的Cpython的GIL锁就在这个问题中被我碰到了.因此只能通过协程解决,如果有更好的解决方法欢迎交流. 协程只需要记忆为自己调动的线程即可,既然GIL使得线程无法完成切换,那么我们就自己完成切换,只要记住await等于切换的点,结合业务逻辑即可完成一个简单的协程编程.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值