leoatchina的博客

一个折腾控写字的地方,生信小菜鸟弱弱地打怪升级中。


  • 首页

  • 分类

  • 标签
leoatchina的博客

没有X的vps上怎么配置才能复制vim界面里的文字

发表于 2017-03-02

讨论见我在知乎上的提问知乎讨论,没有X的vps上怎么配置才能复制vim界面里的文字?

环境阿里云,centos,无论是编译还是yum安装vim,在本地都不能在远程的vim上复制文字

  1. 在vps上安装 neovim或者vim-X11
  2. 并且安装xclip或者xsel
  3. ssh -X user@host (注意 这个 -X)
  4. 用 nvim/vimx target,然后按正常操作
  5. 你可以在本地的clipboard里发现你复制过来的东西 !!

如果你用 windows ssh过去,应该是 nvim+本地 lemonade或者doitclent的组合

leoatchina的博客

ubuntu-MATE 16.04 LTS 安装笔记

发表于 2017-03-02

在 bash 下删除libreoffice

1
2
3
4
5
sudo apt-get remove --purge libreoffice*
sudo apt-get clean
sudo apt-get autoremove

安装vim 等

1
2
3
4
5
6
7
sudo add-apt-repository ppa:wiznote-team ppa:plushuang-tw/uget-stable ppa:t-tujikawa/ppa
sudo apt-get remove vim
sudo apt-get update
sudo apt-get install vim-gnome wiznote fcitx-table-wbpy exfat-fuse exfat-utils uget aria2 clipit git zsh openssh-server grub-customizer software-center terminator okular

安装编译相关

1
sudo apt-get install build-essential autoconf libtool pkg-config python-opengl python-imaging python-pyrex python-pyside.qtopengl idle-python2.7 qt4-dev-tools qt4-designer libqtgui4 libqtcore4 libqt4-xml libqt4-test libqt4-script libqt4-network libqt4-dbus python-qt4 python-qt4-gl libgle3 python-dev

安装chromium

在软件中心里搜索并且安装

安装owncloud

1
https://software.opensuse.org/download/package?project=isv:ownCloud:desktop&package=owncloud-client

安装spf13

1
2
3
git clone https://github.com/leoatchina/spf13-leoatchina-vim.git
cd spf13-leoatchina-vim
bash bootstrap.sh

安装atom

1
2
https://atom.io/download/deb
注意同步

leoatchina的博客

aria2+chrome+BaiduExporter破除速度限制下载百度云上的内容

发表于 2017-03-01

以前我在windows下面时曾经写过一篇
aria2+chrome+BaiduExporter下载百度云

转到mac平台后,方法有所调整

leoatchina的博客

sslocal+proxychains4解决阿里云vps访问github过慢问题

发表于 2017-03-01

阿里云从github clone一些软件后再编译安装 ,速度都很慢。
试过改host或者设置 git的proxy,效果都不好,后来用 sslocal+proxychains4解决问题。

1. 安装pip

wget -c https://bootstrap.pypa.io/get-pip.py
python get-pip.py

2. 安装 sslocal

pip install shadowsocks

3. 配置sslocal

vim ~/sslocal.json

1
2
3
4
5
6
7
8
9
{
"server":"1.1.1.1", #可以使用的ss服务器IP
"server_port":1035, #ss服务器端口
"local_address": "0.0.0.0", #本地ip 注意:不要使用127.0.0.1或192.168.1.100等ip
"local_port":1080,#本地端口
"password":"password",#连接ss服务器密码
"timeout":600,#等待超时
"method":"rc4-md5"#加密方式
}

4. 启动sslocal,并加入开机启动

nohup sslocal -c ~/sslocal .json >/dev/null 2>&1 &
echo “ nohup sslocal -c ~/sslocal .json >/dev/null 2>&1 &” >/etc/rc.local

5. 编译安装最新版 proxychains4

wget -c https://github.com/rofl0r/proxychains-ng/releases/download/v4.11/proxychains-ng-4.11.tar.bz2
tar zxf proxychains-ng-4.11.tar.bz2
cd proxychains-ng-4.11
./configure && make && make install && make install-config

6. 编辑proxychains4配置文件

vim /usr/local/etc/proxychains.conf
更改 socks4 127.0.0.1 9050为socks5 127.0.0.1 1080

7. 测试下你的代理

proxychains4 curl https://api.ipify.org/?format=json

如果配置正确,返回你的ss服务器的ip地址

8. 用proxychain4+git下载

proxychains4 git clone https://github.com/xxxxx/xxxxx.git

下面是我的一个测试结果,速度从4k提升到了1.5m

1
2
3
4
5
6
7
8
9
[proxychains] DLL init: proxychains-ng 4.11
[proxychains] Strict chain ... 127.0.0.1:1080 ... github.com:443 ... OK
[proxychains] DLL init: proxychains-ng 4.11
[proxychains] Strict chain ... 127.0.0.1:1080 ... github.com:443 ... OK
remote: Counting objects: 120391, done.
[proxychains] DLL init: proxychains-ng 4.11
remote: Total 120391 (delta 0), reused 0 (delta 0), pack-reused 120390
Receiving objects: 100% (120391/120391), 84.22 MiB | 1.51 MiB/s, done.
Resolving deltas: 100% (81308/81308), done.

leoatchina的博客

在服务器上装r时踩到的坑

发表于 2017-02-21

为什么要在服务器上装R

其实原因很简单,服务器的性能更强,而且在装了anaconda2后,有比较理想的“云界面”,所以想要扩展R

下载,安装

1
2
3
wget && tar && cd # 这个都是常规,不表。出于实验的目的,我试了下无root权限安装
# 进行onfigure 这一步就出问题
./configure --prefix=$HOME/R/R-3.3.2 --enable-R-shlib

安装zlib

上一步时一直提醒我缺少安装zlib1.2.5以上版本,将就下载,也是无root安装

1
2
3
4
5
6
wget -c http://www.zlib.net/zlib1211.zip #注意我下载 的是1.2.11版本
unzip zlibi1211
cd zlib-1.2.11
./configure --prefix=$HOME/packages
make
make install

问题

还是同样的问题,提醒没有zlib1.2.5以上版本,好,指定目录confiture

./configure –prefix=$HOME/R/R-3.3.2 –enable-R-shlib LDFLAGS=”-L$HOME/packages/lib” CPPFLAGS=”-I$HOME/packages/include”

始终不行,中途试过root权限,换安装位置,重新下载3.3.1等,设置编译参数,都不行

检查configure代码

vim configure
发现了检查zlib版本的代码,有一个 >1.2.5

顿悟

在网上搜索时,发现很多人也有这个问题,突然想到,是不是这个检查zlib版本的代码不对,导致这一步检测不过?
我用的是 1.2.11的包,这是一个字符,不是一个数字
是不是作为字符来说,是1.2.11 < 1.2.5 ?

换装R3.2.5

由于此时已经下载了3.2.5的R包,所以试试

1
2
3
./configure --prefix=$HOME/R/R-3.2.5 --enable-R-shlib LDFLAGS="-L$HOME/packages/lib" CPPFLAGS="-I$HOME/packages/include" # 检查通过 !!!看来这个问题可能在3.3.X的版本上
make
make install # 顺利装上

第二天检查 R-3.3.2的安装

重新非root安装zlib1.2.8到$HOME/packages,然后去configureR-3.3.2

1
2
./configure --prefix=$HOME/R/R-3.3.2 --enable-R-shlib LDFLAGS="-L$HOME/packages/lib" CPPFLAGS="-I$HOME/packages/include" # 编译通过zlib,但是没通过bzip
# 不理他了,先用着已经装上的R-3.2.5版本吧!!!

### 给anconda2安装R扩展
首先,要把R加入当前的$PATH,在你的’~/.zshrc’或者’~/.bashrc’里加入

export PATH=”$HOME/anaconda2/bin:$HOME/R/R-3.2.5/bin:$PATH”
source ~/.zshrc

安装R的包

1
2
3
4
R # 第一样自然是启动R
install.packages(c('repr', 'IRdisplay', 'evaluate', 'crayon', 'pbdoZMQ', 'devtools', 'uuid', 'digest'))
devtools::install_github('IRkernel/IRkernel')
IRkernel::installspec()

会有这样一句话 [InstallKernelSpec] Installed kernelspec ir in /home/xx/.local/share/jupyter/kernels/ir,同时你看到你可以生成R的文本了

在安装R包时可能碰到的问题

1
2
3
4
5
6
# 首先,是不能下载包
options(download.file.method = "wget")
# 编译时碰到的 libssl libcrypto 文件找不到的问题
cd /usr/lib64
sudo ln -s libcrypto.so.1.0.1e libcrypto.so.1.0.0
sudo ln -s libssl.so.1.0.1e libssl.so.1.0.0
leoatchina的博客

学习Anaconda过程中的一些笔记,或者说踩过的坑

发表于 2017-02-20

Anaconda概述

Anaconda是一个用于科学计算的Python发行版,支持 Linux, Mac, Windows系统,提供了包管理与环境管理的功能,可以很方便地解决多版本python并存、切换以及各种第三方包安装问题。Anaconda利用工具/命令conda来进行package和environment的管理,并且已经包含了Python和相关的配套工具。
conda可以理解为一个工具,也是一个可执行命令,其核心功能是包管理与环境管理。

  • 包管理与pip的使用类似,环境管理则允许用户方便地安装不同版本的python并可以快速切换。
  • Anaconda则是一个打包的集合,里面预装好了conda、某个版本的python、众多packages、科学计算工具等等,所以也称为Python的一种发行版
  • conda将几乎所有的工具、第三方包都当做package对待,甚至包括python和conda自身。所以,conda打破了包管理和环境管理约束,能非常方便地安装各种python
  • conda和virtualenv: 在我看来,conda是用于科学计算环境布置,virtualenv主要是用于web服务。

Anaconda安装

去 https://repo.continuum.io/archive/ 下载最新版的 Anaconda
要说明的是, Anaconda有for python2和python3的版本,不过除了这个不同,其他基本没什么区别,我的生信服务器默认是python2,安装了Anaconda2
可以直接用wget下载 ,wget -c https://repo.continuum.io/archive/Anaconda2-4.3.0-Linux-x86_64.sh
不用root安装 ,直接安装到当前用户,bash Anaconda2-4.3.0-Linux-x86_64.sh,会安装在~/anaconda2
注意运行路径,在安装anaconda时,会提醒你在~/.bashrc里加一句export PATH="~/anaconda2/bin:$PATH",但如果你是和我一样,是用zsh为shell,请注意在~/.zshrc里加上这一句
用户安装的不同的python环境都会被放在~/anaconda/envs下,可以在命令中运行conda info -e 查看已经安装的环境,当前已被激活的环境会显示有一个星号或者括号

换成更快的服务器

conda的服务器在国外,如果直接去升级安装会很慢,要换成清华的镜像
如果不做这一步,非常容易出现不能升级安装conda包的情况

1
2
3
4
# 添加Anaconda的TUNA镜像
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
# 设置搜索时显示通道地址
conda config --set show_channel_urls yes

conda的环境管理

Conda的环境管理功能允许我们同时安装若干不同版本的Python,并能自由切换。对于上述安装过程,假设我们采用的是Python 2.7对应的安装包,那么Python 2.7就是默认的环境(默认名字是root,注意这个root不是超级管理员的意思。
比如我的python的是2.7.13,运行python -V,会显示Python 2.7.13 :: Anaconda 4.3.0 (64-bit)
如果我要使用 python3.5,那就安装一个起名为python35的环境

1
2
3
4
5
6
7
8
9
10
11
12
13
conda create --name python35 python3.5
# 安装好后,使用activate激活某个环境
activate python35 # for Windows
source activate python35 # for Linux & Mac
# 激活后,会发现terminal输入的地方多了python35的字样,实际上,此时系统/做的事情就是把默认2.7环境从PATH中去除,再把3.5对应的命令加入PATH
# 你可以用 `which python`或者 `python -V`查看
# 如果想返回默认的python 2.7环境,运行
deactivate python35 # for Windows
source deactivate python35 # for Linux & Mac
# 删除一个已有的环境
conda remove --name python35 --all

conda的包管理,和pip类似,比如你想安装scipy

1
2
3
# 安装scipy
conda install scipy
# conda会从从远程搜索scipy的相关信息和依赖项目,对于python 3.4,conda会同时安装numpy和mkl(运算加速的库)

conda的一些常用操作如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查看当前环境下已安装的包
conda list
# 查看某个指定环境的已安装包
conda list -n python35
# 查找package信息
conda search numpy
# 安装package
conda install -n python35 numpy
# 如果不用-n指定环境名称,则被安装在当前活跃环境
# 更新package
conda update -n python35 numpy
# 删除package
conda remove -n python35 numpy

conda将conda、python等都视为package,因此,完全可以使用conda来管理conda和python的版本,例如

1
2
3
4
5
6
7
8
9
10
11
12
# 更新conda,保持conda最新
conda update conda
# 更新anaconda
conda update anaconda
# 更新python
conda update python
# 安装python3.5的anaconda
conda install -n python35 anacodnda
# 然后你会看到要安装这么多包!!!!!!

你会看到这么多包!

布置jupyter nookbook

首先安装下ipython

sudo yum install ipython

生成配置文件

jupyter notebook –generate-config
生成的文件为~/.jupyter/jupyter_notebook_config.py

生成密码

1
2
3
4
5
6
ipython
In [1]: from IPython.lib import passwd
In [2]: passwd()
Enter password:
Verify password:
Out[2]: 'sha1:7467b7351f12:79fc65998**************3003b87f3'

记录下这个 sha1值,以后要用到

生成jupyter配置文件
jupyter notebook --generate-config
以上将会在 ~/.jupyter/ 下创建默认config 文件: jupyter_notebook_config.py

修改jupyter配置文件 ,vim ~/.jupyter/jupyter_notebook_config.py

1
2
3
4
5
6
c.NotebookApp.ip = '*' #任何ip都可以
c.NotebookApp.open_browser = False
c.NotebookApp.password = u'sha1:209f151dcd7f:a730a81fd00********3ec0a6aa31'#设置密码的时候生成的sha1
c.NotebookApp.port = 8888# 设置未被使用的端口
c.NotebookApp.notebook_dir = u'/mnt/projects' # Notebook启动目录

启动jupyter

jupyter notebook
然后你通过 http://ip:8888就可以访问你的工作目录了

参考

Anaconda使用总结 ypyb PeterYuan
Jupyter notebook 服务器端部署

leoatchina的博客

atom-shortcuts-windows

发表于 2017-02-16

文件操作

‘ctrl-shift-s’ 保存所有打开的文件
‘ctrl-shift-o’ 打开目录
‘ctrl-p’ 从添加的项目中查找文件
‘ctrl-f’ 向下翻页
‘ctrl-b’ 向上翻页
alt-b 或 ctrl-left 移动到单词开始
alt-f 或 ctrl-right 移动到单词末尾
ctrl-g 移动到指定行
ctrl-j 将下一行与当前行合并
ctrl-up, ctrl-down 使当前行向上或者向下移动
ctrl-enter,ctrl-shift-enter在当前行的下一行或上一行插入新的一行
ctrl-k ctrl-l使当前字符小写
ctrl-k ctrl-u使当前字符大写
ctrl-shift-D 复制当前行到下一行
ctrl-shift-K 删除当前行
ctrl-u删除到当前行开始
alt-backspace或ctrl-alt-h删除到当前子单词开始
alt-delete或ctrl-alt-d删除到当前子单词结束
ctrl-backspace或ctrl-w或alt-h删除到当前单词开始
alt-d或ctrl-delete删除到当前子单词开始
alt-left: ‘editor:move-to-previous-subword-boundary’
alt-right: ‘editor:move-to-next-subword-boundary’
alt-shift-left: ‘editor:select-to-previous-subword-boundary’
alt-shift-right: ‘editor:select-to-next-subword-boundary’

选取
alt-shift-B或 ctrl-shift-left 选取至字符开始
alt-shift-F或ctrl-shift-right 选取至字符结束
ctrl-a 全选
alt-f3选取文档中和当前单词相同的所有单词
shift-end 选取至本行结束
ctrl-l 选取一行,继续按回选取下一行
ctrl-d 选取文档中和当前单词相同的下一处

目录树操作
ctrl-\ 或 ctrl-k ctrl-b 显示或隐藏目录树
a 在目录树下添加文件
d 将当前文件另存为
alt-right 和 alt-left 展开(隐藏)所有目录
ctrl-k left 在左半视图中打开文件
ctrl-k down在下半视图中打开文件
ctrl-k up 在上半视图中打开文件
ctrl-k right 在右半视图中打开文件
ctrl-shift-C 复制当前文件绝对路径

其它
ctrl-m 相应括号之间,html tag之间等跳转
ctrl-alt-up, ctrl-alt-down 增加上(下)一行光标
ctrl-shift-u 调出切换编码选项
ctrl-f 在buffer中查找
ctrl-shift-f 在整个工程中查找
alt-ctrl-[ 折叠
alt-ctrl-] 展开
ctrl-alt-i调用控制台
ctrl-/注释
ctrl-alt-c打开color-picker

leoatchina的博客

Atom MacOs 快捷键

发表于 2017-02-16

文件切换

ctrl-shift-s 保存所有打开的文件
cmd-shift-o 打开目录
cmd-\ 显示或隐藏目录树
ctrl-0 焦点移到目录树
目录树下,使用a,m,delete来增加,修改和删除
cmd-t或cmd-p 查找文件
cmd-b 在打开的文件之间切换
cmd-shift-b 只搜索从上次git commit后修改或者新增的文件

导航

(等价于上下左右)
ctrl-p 前一行
ctrl-n 后一行
ctrl-f 前一个字符
ctrl-b 后一个字符

alt-B, alt-left 移动到单词开始
alt-F, alt-right 移动到单词末尾

cmd-right, ctrl-E 移动到一行结束
cmd-left, ctrl-A 移动到一行开始

cmd-up 移动到文件开始
cmd-down 移动到文件结束

ctrl-g 移动到指定行 row:column 处

cmd-r 在方法之间跳转

目录树操作

cmd-\ 或者 cmd-k cmd-b 显示(隐藏)目录树
ctrl-0 焦点切换到目录树(再按一次或者Esc退出目录树)
a 添加文件
d 将当前文件另存为(duplicate)
i 显示(隐藏)版本控制忽略的文件
alt-right 和 alt-left 展开(隐藏)所有目录
ctrl-al-] 和 ctrl-al-[ 同上
ctrl-[ 和 ctrl-] 展开(隐藏)当前目录
ctrl-f 和 ctrl-b 同上
cmd-k h 或者 cmd-k left 在左半视图中打开文件
cmd-k j 或者 cmd-k down 在下半视图中打开文件
cmd-k k 或者 cmd-k up 在上半视图中打开文件
cmd-k l 或者 cmd-k right 在右半视图中打开文件
ctrl-shift-C 复制当前文件绝对路径

书签

cmd-F2 在本行增加书签
F2 跳到当前文件的下一条书签
shift-F2 跳到当前文件的上一条书签
ctrl-F2 列出当前工程所有书签

选取

大部分和导航一致,只不过加上shift

ctrl-shift-P 选取至上一行
ctrl-shift-N 选取至下一样
ctrl-shift-B 选取至前一个字符
ctrl-shift-F 选取至后一个字符
alt-shift-B, alt-shift-left 选取至字符开始
alt-shift-F, alt-shift-right 选取至字符结束
ctrl-shift-E, cmd-shift-right 选取至本行结束
ctrl-shift-A, cmd-shift-left 选取至本行开始
cmd-shift-up 选取至文件开始
cmd-shift-down 选取至文件结尾
cmd-A 全选
cmd-L 选取一行,继续按回选取下一行
ctrl-shift-W 选取当前单词

编辑和删除文本

基本操作

ctrl-T 使光标前后字符交换
cmd-J 将下一行与当前行合并
ctrl-cmd-up, ctrl-cmd-down 使当前行向上或者向下移动
cmd-shift-D 复制当前行到下一行
cmd-K, cmd-U 使当前字符大写
cmd-K, cmd-L 使当前字符小写
cmd-shift-P 搜索命令

删除和剪切

ctrl-shift-K 删除当前行
cmd-backspace 删除到当前行开始
cmd-fn-backspace 删除到当前行结束
ctrl-K 剪切到当前行结束
alt-backspace 或 alt-H 删除到当前单词开始
alt-delete 或 alt-D 删除到当前单词结束

多光标和多处选取

cmd-click 增加新光标
cmd-shift-L 将多行选取改为多行光标
ctrl-shift-up, ctrl-shift-down 增加上(下)一行光标
cmd-D 选取文档中和当前单词相同的下一处
ctrl-cmd-G 选取文档中所有和当前光标单词相同的位置

括号跳转

ctrl-m 相应括号之间,html tag之间等跳转
ctrl-cmd-m 括号(tag)之间文本选取
alt-cmd-. 关闭当前XML/HTML tag

编码方式

ctrl-shift-U 调出切换编码选项

查找和替换

cmd-F 在buffer中查找
cmd-shift-f 在整个工程中查找

代码片段

alt-shift-S 查看当前可用代码片段

在~/.atom目录下snippets.cson文件中存放了你定制的snippets

定制说明

自动补全

ctrl-space 提示补全信息

折叠

alt-cmd-[ 折叠
alt-cmd-] 展开
alt-cmd-shift-{ 折叠全部
alt-cmd-shift-} 展开全部
cmd-k cmd-N 指定折叠层级 N为层级数

文件语法高亮

ctrl-shift-L 选择文本类型

使用Atom进行写作

ctrl-shift-M Markdown预览
可用代码片段

b, legal, img, l, i, code, t, table

git操作

cmd-alt-Z checkout HEAD 版本
cmd-shift-B 弹出untracked 和 modified文件列表
alt-g down alt-g up 在修改处跳转
alt-G D 弹出diff列表
alt-G O 在github上打开文件
alt-G G 在github上打开项目地址
alt-G B 在github上打开文件blame
alt-G H 在github上打开文件history
alt-G I 在github上打开issues
alt-G R 在github打开分支比较
alt-G C 拷贝当前文件在gihub上的网址

推荐一些好用的插件

  • 主题
    atom-material-ui 好看到爆
    atom-material-syntax
  • 美化
    atom-beautify 一键代码美化
    file-icons 给文件加上好看的图标
    atom-minimap 方便美观的缩略滚动图
    pretty-json json格式化工具
    activate-power-mode 炫酷的打字特效
  • git
    atomatigit 可视化git操作
    git-time-machine git版本对比工具,可视化选择每一个commit
    merge-conflicts 合并冲突可视化工具
  • 代码提示
    emmet 这个不用介绍了吧
    atom-ternjs js代码提示很强大,高度定制化
    docblockr jsdoc 给js添加注释
    autoclose-html 闭合html标签
    color-picker 取色器 必备插件
    pigments 颜色显示插件 必装
    terminal-panel 直接在atom里面写命令了
    svg-preview svg预览
  • 便捷操作
    advanced-open-file 快速打开、切换文件
    project-folder 快速打开、切换项目
    script 立即执行当前js文件
  • 高亮
    language-vue vue框架代码高亮
  • 终端
    platformio-atom-ide-terminal 终端插件,支持显示、隐藏及多窗口

就这些了,欢迎pull更多好用的插件!

leoatchina的博客

centos升级gcc

发表于 2017-02-15 | 分类于 linux

我的生信小型机装的系统是centos6.6,在装vim的插件YouCompleteMe时,需要gcc升级到4.8以上版本。网上搜索了一番后,编译安装最新版。

  1. 下载最新版gcc并解压

    wget -c http://ftp.gnu.org/gnu/gcc/gcc-6.3.0/gcc-6.3.0.tar.bz2
    tar jxvf gcc-6.3.0.tar.bz2

  2. 下载另外所需文件

    cd gcc-6.3.0
    ./contrib/download_prerequisites 

  3. 建立一个目录供编译出的文件存放

    mkdir gcc-build-6.3.0
    cd gcc-build-6.3.0

  4. 生成Makefile文件,注意我把prefix设置成了 /usr,直接把gcc装到对应的目录,不需要ln -s了

    ../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib –prefix=/usr

  5. 编译,j后面是核心数,我因为是小型服务器,一共8核16线程,所以就设置的比较大,一般设置成4

    make -j8 //我的cpu跑到了差不多满100%

  6. 安装

    sudo make install

  7. 检查,如

    gcc –version
    c++ –version
    cc –version
    whereis gcc
    which gcc

leoatchina的博客

python_thread_sync

发表于 2017-02-14 | 分类于 python

前言

Python的代码的执行是由Python虚拟机(又名解释器主循环)进行控制的。Python在设计时就是这样考虑的,在主循环中同时只能有一个控制线程在执行,就像单核CPU系统中的多进程一样。内存中可以有许多程序,但是在任意给定时刻只能有一个程序在运行。同理,尽管Python解释器中可以运行多个线程,但是在任意给定时刻只有一个线程会被解释器执行。
对Python虚拟机的访问是由全局解释锁(GIL)控制的。这个锁就是用来保证同时只能有一个线程运行的。在多线程环境中,Python虚拟机将按下面所述的方式执行。

  1. 设置GIL。
  2. 切换进一个线程去运行。
  3. 执行下面操作之一。
    • 指定数量的字节码指令
    • 线程主动让出控制权
  4. 把线程设置回睡眠状态
  5. 解锁GIL
  6. 重复上述步骤

在讨论普通的GIL之前,有一点要强调的是GIL只会影响到那些严重依赖CPU的程序(比如计算型的)。 如果你的程序大部分只会设计到I/O,比如网络交互,那么使用多线程就很合适, 因为它们大部分时间都在等待。
对于CPU依赖型的程序,你要搞清楚计算的特点。把性能瓶颈优化到关键的部分,如对数组的操作用NumPy这样的模块就非常的高效。

theading模块

是最常用的多线程模块,老的thread模块就不用看了

有Thread、Lock、Rock、Condition、Event、Semaphore、BoundedSemphore、Timer、Barrier等一系列可用对象

Thread对象

基本代码

1
2
3
4
5
6
7
# 建立对象
t = threading.Thread(target = function, args = (arg1,arg2))
# 一般来说,Thread线程对象建立之后,不是马上启动的,是用start方法启动
t.start()
# 加入主线程,如果不加入,在主线程退出后仍然运行。join()方法只有在你需要等待线程完成的时候才是有用的
# join如果不被调用 ,将会一直被运行
t.join()

Thread启动后不能用ctrl+c手动终止的解决方法

这里引用别人描述

爬虫作为子线程运行时不受键盘中断信号影响,Ctrl-C无法终止整个爬虫运行。另外的一个场景是多线程压力测试,需要提前终止的情况下,Ctrl-C依旧不能终止整个程序。除了简单粗暴的使用kill命令强行终止之外,本文将给出一个简单可行的解决方案。
可能,python2 和python3对于异常的处理逻辑不一致,2中所有的异常在主线程真正退出时才被捕获。

12
leoatchina

leoatchina

20 日志
3 分类
34 标签
RSS
Github jianshu Zhihu 生信技能树
© 2017 leoatchina
由 Hexo 强力驱动
主题 - NexT.Pisces