睡眠排序——没什么事是睡一觉解决不了的

python基础

浏览数:72

2020-6-17

新年快乐呀

前几天看到一段js代码,脑洞属实够大。

const original = [3, 1, 15, 2, 9, 6, 3, 2, 7, 1]
const result = []

original.forEach(n => setTimeout(() => result.push(n), n))

以上代码利用setTimeout()函数,对于要排序的数组,根据不同的数值在不同的线程中休眠不同时间在push进结果中,以此来实现排序。

这种排序算法被称为“睡眠排序”。试着用Python来写个多线程程序玩一下。

import time, threading


original = [3, 1, 15, 2, 9, 6, 3, 2, 7, 1]
result = []
# 存储线程实例的列表
pool = []

# 睡眠后append
def sleepSort(num):
    time.sleep(num)
    result.append(num)

# 创建多个线程
for i in range(len(original)):
    t = threading.Thread(target=sleepSort, args=(original[i],))
    pool.append(t)

for t in pool:
    t.start()

for t in pool:
    t.join()

print(result)

我没有对源数据做任何处理就将其做为time.sleep()的参数了,所以这个时间花费嘛,嘿嘿,娱乐娱乐就行

另外,threading模块中还有个Timer类,其第一个参数接收一个数值为指定的定时时间,其余地方和Thread一样,时间到后再调用要执行的function。改写的代码如下:

import time, threading


original = [3, 1, 15, 2, 9, 6, 3, 2, 7, 1]
result = []
pool = []

def sleepSort(num):
    time.sleep(num)
    result.append(num)

for num in original:
    t = threading.Timer(num, sleepSort, args=(num,))
    pool.append(t)

for t in pool:
    t.start()

for t in pool:
    t.join()

print(result)

作者:公子政