Python學習筆記(一)

來源:互聯網
上載者:User

標籤:python

         

1  .netstat -no 這個命令是察看連接埠的,並且可以通過pid察看是哪些程式在用這些連接埠!


2  在Python中或其它語言中,利用Socket編寫伺服器和用戶端通訊程式,經常會遇到一個錯誤:
socket.error: [Errno 10048] 通常每個通訊端地址(協議/網路地址/連接埠)只允許使用一次這個提示會在連接埠衝突的時候出現,可能的原因是在伺服器程式中建立一個Socket開啟一個連接埠後,在程式結束的時候沒有關閉這個Socket,因此下

次啟動程式就會出現這個錯誤提示,解決方案:1、在伺服器程式結束的時候要關閉Socket  2、或者更換連接埠號碼  3、重啟機器


3 ipconfig 查看原生ip


4. AttributeError: ‘module‘ object has no attribute "funSalaryGuide"這個錯誤相信很多django的開發人員都會遇到。一般來說都是應用沒有安裝完成,重新安裝就可以了


5.pyc檔案,是python編譯後的位元組碼(bytecode)檔案。只要你運行了py檔案,python編譯器就會自動產生一個對應的pyc位元組碼檔案。這個pyc位元組碼檔案,經過python解譯器,會產生機器碼運行(這也是為什麼pyc檔案可以跨平台部署,

類似於java的跨平台,java中JVM啟動並執行位元組碼檔案)。下次調用直接調用pyc,而不調用py檔案。直到你這個py檔案有改變。python解譯器會檢查pyc檔案中的產生時間,對比py檔案的修改時間,如果py更新,那麼就產生新的pyc。


6.t = MyThread(2)

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    t = MyThread(2)
  File "C:\Users\bsamsung\Desktop\Python27\線程\join.py", line 7, in __init__
    theading.Thread.__init__(self)
NameError: global name ‘theading‘ is not defined

就像遇到這個問題 ,Python並不會提前編譯器,她先運行,當遇到哪裡錯了,才開始停下來

 

7.accept方法返回一個含有兩個元素的 元組(connection,address)。第一個元素connection是新的socket對象,伺服器必須通過它與客戶通訊;第二個元素 address是客戶的Internet地址。


8.xrange 用法與 range 完全相同,所不同的是產生的不是一個list對象,而是一個產生器。

 

9。python 中的if __name__ == ‘main’:

語句輸入需要使用的模組。
   每個模組都有一個內建的變數__name__。在模組自己啟動並執行時候,該__name__就等於‘main‘,而如果被其他的模組import,則該模組的__name__就等於模組名,也就是檔案名稱去掉py副檔名的部分。

如下例子:
test.py
def test():
    print "test is running"

if __name__ == "__main__":#自運行時調用該程式塊
    print "test main is working"

if __name__ == "test":#import時調用該程式塊
    print "test is invoked"

 

 


10.非阻塞或非同步編程

例如,對於一個聊天室來說,因為有多個串連需要同時被處理,所以很顯然,阻塞或同步的方法是不合適的,這就像買票只開了一個視窗,佷多人排隊等一樣。那麼我們如何解決這個問題呢?主要有三種方法:forking、threading、非同步

I/O。

Forking和threading的方法非常簡單,通過使用SocketServer服務類的min-in類就可以實現。forking只適用於類Unix平台;threading需要注意記憶體共用的問題。
非同步I/O如果底層的方法來實現是有點困難的。要簡單點,我們可以考慮使用標準庫中的架構或Twisted(Twisted是一個非常強大的非同步網路編程的架構)。

一、用ScoketServer實現Forking和threading

下面我們使用兩個例子來分別建立forking伺服器和threading伺服器。

Forking 伺服器:

from SocketServer import TCPServer, ForkingMixIn, StreamRequestHandler

class Server(ForkingMixIn, TCPServer): pass

class Handler(StreamRequestHandler):
    def handle(self):
        addr = self.request.getpeername()
        print ‘Got connection from‘, addr
        self.wfile.write(‘Thank you for connecting‘)

server = Server((‘‘, 1234), Handler)
server.serve_forever()

threading伺服器:

from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler

class Server(ThreadingMixIn, TCPServer): pass

class Handler(StreamRequestHandler):
    def handle(self):
        addr = self.request.getpeername()
        print ‘Got connection from‘, addr
        self.wfile.write(‘Thank you for connecting‘)

server = Server((‘‘, 1234), Handler)
server.serve_forever()

二、使用select實現非同步I/O

所謂非同步I/O,打個比方,就是如果一大群人都想你聽他說話,那麼你就給他們每人一分鐘的時間說,大家輪流說,沒說完的待會兒輪到時再繼續說。也就是一個時間片的方法。

要實現非同步I/O,我們可以通過使用架構asyncore/asynchat或Twisted,它們都是基於select函數或poll函數(poll只適於類Unix系統)的。select和poll函數都來自select模組。

select 函數要求三個必須序列作為參數和一個可選的以秒為單位的逾時值。序列中是表示檔案描述符的整數值,它們是我們要等待的串連。這三個序列是關於輸入、輸出和 異常條件的。如果逾時值沒有給出的話,select將處於阻塞狀態(

也就是等待)直到有檔案描述符準備動作。如果逾時值給出了,那麼select只阻塞給 定的時間。如果逾時值是0的話,那麼將不阻塞。select返回的值是一個由三個序列組成的元組,它們分別代表相應參數的活動的子集。例如,第一個序列

返 回的是用於讀的輸入檔案描述符構成的序列。

序列可以包含檔案對象(不適於Windows)或socket。下面這個例子建立一個使用 select去服務幾個已連線的服務器(注意:服務端的socket自身也提供給了select,以便於它能夠在有新的串連準備接受時發出訊號通知)。這個 伺服器只是

簡單地列印接受自用戶端的資料。你可以使用telnet(或寫一個基於socket的簡單的用戶端)來串連測試它。

select server

import socket, select

s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host, port))

s.listen(5)
inputs = [s]
while True:
    rs, ws, es = select.select(inputs, [], [])
    for r in rs:
        if r is s:
            c, addr = s.accept()
            print ‘Got connection from‘, addr
            inputs.append(c)
        else:
            try:
                data = r.recv(1024)
                disconnected = not data
            except socket.error:
                disconnected = True

            if disconnected:
                print r.getpeername(), ‘disconnected‘
                inputs.remove(r)
            else:
                print data

 

 

 

 


11   python是支援多線程的,並且是native的線程。主要是通過thread和threading這兩個模組來實現的。 python的thread模組是比較底層的模組,python的threading模組是對thread做了一些封裝的,可以更加方便的被使用。一般來說,

使用線程有兩種模式,一種是建立線程要執行的函數,把這個函數傳遞進Thread對象裡,讓它來執行;另一種是直接從Thread繼承,建立一個新的class,把線程執行的代碼放到這個新的 class裡。

 

12用Python可以做什嗎?可以做日常任務,比如自動備份你的MP3;可以做網站,很多著名的網站包括YouTube就是Python寫的;可以做網路遊戲的後台,很多線上遊戲的後台都是Python開發的。總之就是能幹很多很多事啦。

Python當然也有不能乾的事情,比如寫作業系統,這個只能用C語言寫;寫手機應用,只能用Objective-C(針對iPhone)和Java(針對Android);寫3D遊戲,最好用C或C++。

 


13 作業系統輪流讓各個任務交替執行,任務1執行0.01秒,切換到任務2,任務2執行0.01秒,再切換到任務3,執行0.01秒……這樣反覆執行下去。表面上看,每個任務都是交替執行的,但是,由於CPU的執行速度實在是太快了,我們感覺就

像所有任務都在同時執行一樣。真正的並存執行多任務只能在多核CPU上實現,但是,由於任務數量遠遠多於CPU的核心數量,所以,作業系統也會自動把很多任務輪流調度到每個核心上執行。

 


14.一種是啟動多個進程,每個進程雖然只有一個線程,但多個進程可以一塊執行多個任務。

    還有一種方法是啟動一個進程,在一個進程內啟動多個線程,這樣,多個線程也可以一塊執行多個任務。

    當然還有第三種方法,就是啟動多個進程,每個進程再啟動多個線程,這樣同時執行的任務就更多了,當然這種模型更複雜,實際很少採用。
  
    線程是最小的執行單元,而進程由至少一個線程組成。如何調度進程和線程,完全由作業系統決定,程式自己不能決定什麼時候執行,執行多長時間。

    多進程和多線程的程式涉及到同步、資料共用的問題,編寫起來更複雜

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Python學習筆記(一)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.