python2多線程_多進程_例程

使用python實現多線程:

首先python的多線程是一種假的多線程;

 

以下是線程,進程的一些定義:

線程的簡要定義是:線程都是作爲利用CPU的基本單位,可併發執行,可以是程序中一個獨立運行的片段,是花費最小開銷實體

進程的簡要定義是:進程是一個具有獨立功能的程序關於某個數據集合的一次運行活動。它可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體

多線程的簡要定義是:多個線程併發執行的技術。

多進程的簡要定義是:一個父進程創建了幾個子進程(相當於一個兩個沒啥關係的python程序合到一個python文件中)

可以用生物學上的作爲類比:比如人體的各種器官同時工作才能維持人體的穩定,可以類比爲多進程處理不同的事情,以這次新型冠狀病毒爲例,進程類比爲免疫器官,而線程就是各種免疫細胞,進程的目的是爲了消滅病毒,就申請了很多的能量和物質用,真正用這些能量和物質的就是線程,比如一堆的白細胞去追殺病毒,用的是進程申請的資源,處理的是進程的事情,多個白細胞同時工作可以類比爲多線程

注意:線程是異步的,所以類比起來比較奇怪的,你想想,一個白細胞剛剛準備吞一個病毒,結果上面說你先暫停,另一個白細胞準備去死了。。。

 

以下是python2相關例程:

多進程:

import multiprocessing

# 子進程1
def multiProc1(number):
    time.sleep(3)
    print(number)

# 子進程2
def multiProc2(number):
    print(number)

# 父進程
def mainProc():
    print("Welcome!!!")

    # 啓動兩個進程(兩個同時運行,不用等待結束後再啓動下一個)
    p = multiprocessing.Process(target=multiProc1,args =(1))
    print('Child process multiProc1 will start.')
    p.start()

    p = multiprocessing.Process(target=multiProc1,args =(2))
    print('Child process multiProc1 will start.')
    p.start()

if __name__ == '__main__':
    mainProc()

多進程(用的比較多的就是這個socket):

服務端:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import socket
import threading

def tcplink(sock, addr):
    print('Accept new connection from %s:%s...' % addr) 
    sock.send(b'Welcome_To_Join_The_Conference')    # 發送歡迎信息
    while True:
        data = sock.recv(1024)  # 接收客戶端信息
        if not data or data.decode('utf-8') == 'exit':
            break
    
    # 關閉連接
    sock.close()
    print('Connection from %s:%s closed.' % addr)

def startServer():

    # 配置服務端
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = '192.168.0.102'     # 配置服務器IP地址
    port = 8888    # 配置服務器端口號(使用1025~65535端口號)
            
    # 綁定端口
    try:
        s.bind((host, port))        # 綁定端口
        print("Server started successfully !")
    except OSError:
        return False
    
    s.listen(5)
    print('Waiting for connection...')
        
    # 啓動多線程,等待客戶端連接
    while True:
        sock, addr = s.accept()
        t = threading.Thread(target=tcplink, args=(sock, addr))
        t.start()


if __name__ == '__main__':
    startServer()

客戶端(多運行幾個客戶端就可以體會到多線程的含義):

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import socket

def connectServer():
    try:
        # 配置客戶端
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        host = '192.168.0.102'     # 配置服務器IP地址
        print('Current computer IP address:' + host)
        port = 8888    # 配置服務器端口號(使用1025~65535端口號)

        # 連接服務端
        s.connect((host, port))
        data = s.recv(1024).decode('utf-8')    # 接收歡迎信息
        print(data)
        s.send(b'Welcome_To_Join_The_Conference')    # 發送消息到服務端
 
            
    except Exception,err:
        print(err)
    finally:
        s.send(b'exit')
        s.close()

if __name__ == '__main__':
    connectServer()

爲什麼說這個python的多線程是假的多線程呢?

因爲全局解釋器鎖的問題,說白話點就是現在的處理器大都是多核的,但是python多線程佔用永遠只有一個核,也就是說你是一個八核處理器,你可以用python寫八個個死循環的線程,你就會發現這個cpu佔用率永遠只有大概12.5%左右,但是像c語言這種寫的多線程,可以搞到100%,想要python的程序也能100%的佔用,你試試把八個死循環線程換成多進程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章