天才排序算法:睡眠排序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等于切换的点,结合业务逻辑即可完成一个简单的协程编程.

猜你喜欢

转载自blog.csdn.net/m0_37422289/article/details/79198529