新年快乐呀
前几天看到一段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)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。