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

新年快乐呀javascript

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

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

这种排序算法被称为“睡眠排序”。试着用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)
相关文章
相关标签/搜索