一核有难,八核围观

前言

  自从有了实验室的服务器,就很少在自己的笔记本上跑代码了,一个原因是有许多工具在windows上并没有支持;另一个是自己的笔记本的算力非常差,跑个深度学习的代码非常耗时;而最后一个原因则是有一台24小时开机的服务器不用白不用哈哈哈。
  因为在基因变异检测这方面,在数据预处理方面比较复杂,需要用到很多工具,而且序列文件往往又多又大,为了提取某一个样本的特征往往需要耗费很多时间,就算是编写好全套脚本丢给服务器去跑然后自己去睡觉也是非常耽误进度的。所以说,利用多核加速迫在眉睫。

多线程or多进程

  第一次使用多线程技术还是在本科时候,为了参加创新实验室的选拔在爬虫中加入了多线程来提高效率,当时确实是提高了不少的效率,可是当我把套路同样用在今天时候,居然还没有暴力for循环来的快?运行过IDE中的Profile后发现时间大部分花在了锁的获取与释放中。线程与进程的区别网上一搜一大把,也没必要赘述。同时又是python GIL的缘故,要想真正利用好多个核心,还是优先使用多进程技术。

附录

  留下一份python多进程的demo,方便以后直接套用。

1
2
3
4
5
6
7
8
9
10
11
12
13
from multiprocessing import Pool, Manager

def task(x, list):
list.append(x)

p = Pool(4)
list = Manager().list()
for i in range(10):
p.apply_async(task, args=(i, list))
p.close()
p.join()

print(list)

PS 再补充一份shell多线程的demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/zsh

start_time=`date +%s`

tmp_fifofile="/tmp/$$.fifo"
mkfifo $tmp_fifofile
exec 6<>$tmp_fifofile
rm $tmp_fifofile

thread_num=8

for ((i=0;i<${thread_num};i++));do
echo
done >&6

for i in {1..20}
do
read -u6
{
sleep 1
echo $i
echo >&6
} &
done

wait

stop_time=`date +%s`
echo "TIME:`expr $stop_time - $start_time`"

exec 6>&-
echo "over"