<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] ## 1. 進程 ### 1.1 fork > * 適用于Unix/Linux系統,不適合Windows > * 每次調用fork函數都會創建兩個進程(父子進程) > * 使用計算密集型的任務 ~~~ import os rpid = os.fork() if rpid<0: print("fork調?失敗。 ") elif rpid == 0: print("我是?進程(%s) , 我的?進程是(%s) "%(os.getpid(),os.getppid())) x+=1 else: print("我是?進程(%s) , 我的?進程是(%s) "%(os.getpid(),rpid)) print("??進程都可以執?這?的代碼") ~~~ > 1. 調用fork進程后,回返回兩個結果,這兩個結果時對應的兩個進程 子進程:rpid==0 父進程:rpid >0 > 2. 調用fork函數后的代碼,都會在父子進程中執行,可以理解為fork后邊的代碼被分發到了父子進程中去執行,但是執行互不影響(進程資源獨立) ### 1.2 multiprocessing > * fork適用于Unix/Linux系統,但是不適用于Windows平臺,但是Python是跨平臺的語言,難道Windows就不能寫多進程任務了嗎?答案肯定是no。 > * multiprocessing模塊是就是解決上面問題的,可以實現真正的跨平臺 ~~~ from multiprocessing import Process import os # ?進程要執?的代碼 def run_proc(name): print('?進程運?中, name= %s ,pid=%d...' % (name, os.getpid())) if __name__=='__main__': print('?進程 %d.' % os.getpid()) p = Process(target=run_proc, args=('test',)) print('?進程將要執?') p.start() p.join() print('?進程已結束') ~~~ ## 2. 線程 ### 2.1 創建線程 > * 線程由進程創建,并且多個線程共享進程的資源,不像進程間通信那樣費勁 > * 適合I/O(網絡、磁盤)量比較大的任務,比如爬蟲(多網絡、多磁盤I/O) 1. 直接使用Thread類構建線程 ~~~ from threading import Thread import threading import os def thread(): print("-----------thread--------%s",threading.current_thread().name) def main(): for i in range(5): p = Thread(target=thread) p.start() if __name__ == '__main__': main() ~~~ 2. 繼承Thread類,并重寫run方法 ~~~ from threading import Thread import os class SubThread(Thread): def run(self): print("子進程----name:"+self.name) print(os.getpid()) for i in range(10): subThread = SubThread() subThread.start() ~~~ ### 2.2 進程鎖 ~~~ import threading import time lock1 = threading.Lock() lock2 = threading.Lock() class SubThread(threading.Thread): def run(self): while True: if lock1.acquire(): # 每次獲取鎖都會停在這,所以只會打印一次 time.sleep(1) print("--------------1------------") lock1 = threading.Lock() class SubThread2(threading.Thread): def run(self): while True: if lock2.acquire(): # 每次獲取鎖都會停在這,所以只會打印一次 time.sleep(1) print("--------------2------------") lock2.release() # 釋放鎖,下次lock2.acquire()就可以獲取到鎖 t1 = SubThread() t2 = SubThread2() t1.start() t2.start() ~~~ * 打印結果 ~~~ --------------1------------ --------------2------------ --------------2------------ --------------2------------ --------------2------------ --------------2------------ --------------2------------ ~~~ 說明雖然在一個線程中,只要調用一次 lock2.acquire()方法,就會尋找鎖,所有第一個線程只能打印一次,第二個線程無限的打印 * 利用這一性質實現多個線程的協作,無限的順序打印 ~~~ from threading import Thread,Lock from time import sleep lock1 = Lock() lock2 = Lock() lock2.acquire() #創建另外?把鎖, 并且“鎖上” lock3 = Lock() lock3.acquire() class Task1(Thread): def run(self): while True: if lock1.acquire(): print("------Task 1 -----") sleep(0.5) lock2.release() class Task2(Thread): def run(self): while True: if lock2.acquire(): print("------Task 2 -----") sleep(0.5) lock3.release() class Task3(Thread): def run(self): while True: if lock3.acquire(): print("------Task 3 -----") sleep(0.5) lock1.release() t1 = Task1() t2 = Task2() t3 = Task3() t1.start() t2.start() t3.start() ~~~ 打印結果如下 ~~~ ------Task 1 ----- ------Task 2 ----- ------Task 3 ----- ------Task 1 ----- ------Task 2 ----- ------Task 3 ----- ... ~~~ ## 3. 協程 ## 4. 單路復用 ### 4.1 select select最早于1983年出現在4.2BSD中,它通過一個select()系統調用來監視多個文件描述符的數組(在linux中一切事物皆文件,塊設備,socket連接等。),當select()返回后,該數組中就緒的文件描述符便會被內核修改標志位(變成ready),使得進程可以獲得這些文件描述符從而進行后續的讀寫操作(select會不斷監視網絡接口的某個目錄下有多少文件描述符變成ready狀態【在網絡接口中,過來一個連接就會建立一個'文件'】,變成ready狀態后,select就可以操作這個文件描述符了)。 在不使用多進程和多線程的前提下,實現高并發服務器有三種方式select、poll、epoll ~~~ import select import socket import sys server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('', 7788)) server.listen(5) inputs = [server, sys.stdin] running = True while True: readable, writeable, exceptional = select.select(inputs, [], []) # 阻塞等待 for sock in readable: if sock == server: conn, addr = server.accept() inputs.append(conn) elif sock == sys.stdin: cmd = sys.stdin.readline() running = False break else: data = sock.recv(1024) if data: sock.send(data) else: inputs.remove(sock) sock.close() if not running: break ~~~ select()方法接收并監控3個通信列表, 第1個是所有的輸入的data,就是指外部發過來的數據, 第2個是監控和接收所有要發出去的data(outgoing data),當一個socket進來后,他就會進入可寫隊列 第3個監控錯誤信息,接下來我們需要創建2個列表來包含輸入和輸出信息來傳給select().
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看