python windows epoll_Windows 10生产力提升之WSL实践
Mac 和 Windows 哪個更好,估計還能再吵幾年。拋開部分硬件上的差距,Windows 用作開發(fā)上確實有點不順手,畢竟大部分后端程序都是運行在 Linux 服務器上,macOS 占有先天優(yōu)勢。之前都是通過在 Windows 上起虛擬機來解決這個問題,如今 Windows 10 推出的 WSL(Windows Subsystem for Linux),成為了新的選擇。
WSL 的官方介紹: The Windows Subsystem for Linux lets developers run GNU/Linux environment
- including most command-line tools, utilities, and applications
- directly on Windows, unmodified, without the overhead of a virtual machine
簡單來說就是不需要修改,無需虛擬機,就可以在 Windows 上直接使用 Linux 環(huán)境(grep,?sed,?awkd等),運行 Linux 程序(vim, MySQL, Apache等)。這就很舒服了,小孩子才做選擇,大人全都要,實際如何我們來實踐一番。
安裝
啟動之后就可以使用了,你可以根據(jù)自己使用習慣,做一些初始化的設置(oh-my-zsh啥的)這里就不細說了。WSL 默認是通過安裝的應用進入的(直接運行 bash.exe 也行),但大家還是喜歡通過 Xshell 等工具進入了,這就需要做一些配置。WSL 和 Windows 本機是端口共用的(這點特別注意,防止程序端口沖突了),直接通過 127.0.0.1 就能連接上,剩下的就和直接使用 Linux 差不多了。
但是,等你重啟電腦,再使用 Xshell 連接時發(fā)現(xiàn)連不上了,沒有 sshd 進程了,每次都需要打開 WSL 程序然后再運行 sudo service ssh start 有點麻煩。這就是 WSL 不一樣的地方了,WSL 不是真正的一個系統(tǒng),沒有開機啟動這一說,把 sshd 設置成開機啟動也沒有用。既然不能加入到 WSL 的啟動項,那就加入到 Windows 的啟動項中:
編寫 run_wsl.vbs 腳本,用來在 bash.exe 中啟動 sshd,然后將腳本放到系統(tǒng)啟動目錄里面(WIN+R 運行 shell:Common Startup 或者 shell:startup)就行了。
1
2 setws=wscript.createobject("wscript.shell")
ws.run"C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/service ssh restart'",0
不過需要注意?sudo 需要輸入密碼,還得把密碼關了。WSL 中運行?sudo visudo 增加一行:ubuntu ALL=(root) NOPASSWD: ALL,表示 ubuntu (換成自己的)這個用戶使用 sudo 運行任何命令時都不用輸入密碼。
當然安裝之后可能會遇到一些其它問題,主要是一些安全軟件和 WSL 不兼容,比如卡巴斯基會讓 WSL 無法聯(lián)網(wǎng),騰訊的 TGP 會影響綁定端口,遇到了只能暫時關掉相關軟件,相信之后這些問題會越來越少。
使用 Redis
之前在 Windows 上使用 Redis 比較麻煩,有一個 Windows 版的 Redis 但已經(jīng)很久沒有更新了,還有就是選擇虛擬機。現(xiàn)在直接在 WSL 里面編譯安裝(make & make install)就行了。寫好配置文件,sudo redis-server /etc/redis/redis.conf 運行即可。
不過有些同學可能會像我之前把 Redis 注冊為 systemd 服務,但發(fā)現(xiàn)會報錯:System has not been booted with systemd as init system (PID 1). Can't operate 說的也比較明白,系統(tǒng)不是通過 systemd 啟動的。其實 WSL 不是一個真正的系統(tǒng),應該說是一個容器,類似 Docker(這么一說感覺微軟野心好大)。
在 WSL 中運行的程序是真正的 Linux 二進制文件,不是移植版,不過當程序由用戶態(tài)切換到內(nèi)核態(tài)時lxss.sys和lxcore.sys驅(qū)動將會將 Linux 的系統(tǒng)調(diào)用翻譯為??NT APIs 來模擬 Linux 內(nèi)核。簡單來說 WSL 是將 LInux 底層 API 用 NT 實現(xiàn)了一遍(所以 WSL 中沒有 Linux kernel?代碼),而且有些操作還是 Linux 獨有的,比如fork(),可想而知這里面工作量有多大,任重而道遠。
言歸正傳,Redis 已經(jīng)在 WSL 中啟動了,我們試試在 Windows 上能不能連上:
完美,就和 Windows 本地裝的 Redis 一樣。
與IDE集成
雖然說大部分語言都是跨平臺的,但是還是有很多差別,比如 Python 的 epoll 只能在 Linux 下使用。在 Windows 上開發(fā)不是很方便,沒有智能提示,還需要上傳到服務器運行、調(diào)試。有了 WSL,現(xiàn)在可以在 Windows 上開發(fā),然后直接在 WSL 里面運行。
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
33
34
35
36
37
38
39
40 #!/usr/bin/env python3
# -*- coding: utf-8 -*-
importsocket
importselect
# 創(chuàng)建套接字
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('127.0.0.1',6688))
s.listen(100)
# 創(chuàng)建一個epoll對象
epoll=select.epoll()
epoll.register(s.fileno())
clients={}
whileTrue:
events=epoll.poll()
forfd,eventsinevents:
iffd==s.fileno():
conn,addr=s.accept()
clients[conn.fileno()]={
'conn':conn,
'addr':addr
}
print("new client {}".format(addr))
epoll.register(conn.fileno(),select.EPOLLIN|select.EPOLLET)
elifevents==select.EPOLLIN:
# Available for read
recv=clients[fd]['conn'].recv(1024)
ifrecv:
print("recv {} from {}".format(recv.strip(),clients[fd]['addr']))
clients[fd]['conn'].sendall(b'echo '+recv)
else:
# 客戶端斷開
print("close client {}".format(clients[fd]['addr']))
delclients[fd]
epoll.unregister(fd)
else:
print(fd,events)
WSL 中運行,并通過 Windows cmd 連接:
當然這也是不太方便,兩個程序切來切去,更近一步,讓這些都在 IDE 中進行。
首先要讓當前代碼在 WSL 中運行,新建一個 WSL Interpreter(獲得運行環(huán)境和智能提示),填寫需要的 Python 路徑。再把 Terminal 的環(huán)境也改成 bash.exe。
最后點擊 IDE Run 按鈕,然后打開 Terminal,運行 telnet 連接上去做測試,這一切都在 IDE 里面,沉浸式工作體驗,效率提升大幅提升,完全感受不出來是在使用 Windows。
結語
其實吧,你看宇宙第一 IDE:Visual Studio 都有 Mac 版了,平臺間的差距都被各種軟件抹平了。少點撕逼,多提高工作效率,少加班才是正道。
參考資料
總結
以上是生活随笔為你收集整理的python windows epoll_Windows 10生产力提升之WSL实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记录值上调10_「阴阳师」10月16日维
- 下一篇: 红河多少钱啊?