溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

9)網(wǎng)絡(luò)并發(fā) 編程、進(jìn)程、線程和協(xié)程

發(fā)布時(shí)間:2020-06-19 20:48:43 來源:網(wǎng)絡(luò) 閱讀:6515 作者:tty之星 欄目:編程語(yǔ)言

                          并發(fā)網(wǎng)絡(luò)

Server

#!/usr/bin/env python
#-*-conding:utf-8-*-
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',9009))
sk.listen()
conn,addr = sk.accept()
conn.send(b'heooo')
msg = conn.recv(1024)
print(msg)
conn.close()
sk.close()

 

Client

#!/usr/bin/env python
#-*-conding:utf-8-*-
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9009))
print(sk.recv(1024))
sk.send(b'busdf')
sk.close()

 

socketserver并發(fā)的模塊

模塊:

#!/usr/bin/env python
#-*-conding:utf-8-*-
import socketserver
class Myserver(socketserver.BaseRequestHandler):
    def handle(self):
        conn = self.request
        print(conn)
myserver = socketserver.ThreadingTCPServer(('127.0.0.1',9988),Myserver)
myserver.serve_forever()

 

Server端:

9)網(wǎng)絡(luò)并發(fā) 編程、進(jìn)程、線程和協(xié)程

 Client端:

9)網(wǎng)絡(luò)并發(fā) 編程、進(jìn)程、線程和協(xié)程 

 

 

并發(fā)編程:

一個(gè)程序在同一時(shí)刻做多件事情

基于多道批處理系統(tǒng)和分時(shí)系統(tǒng)

解決程序中IO操作影響程序的效率問題

多個(gè)程序、作業(yè)在遇到IO操作的時(shí)候,操作系統(tǒng)會(huì)幫助你進(jìn)行切換

cpu的利用率得到最大的提高

 9)網(wǎng)絡(luò)并發(fā) 編程、進(jìn)程、線程和協(xié)程

操作系統(tǒng) 只負(fù)責(zé)管理調(diào)度進(jìn)程

什么叫進(jìn)程:

運(yùn)行中的程序:

進(jìn)程:是操作系統(tǒng)總資源分配的最小單位

每一個(gè)運(yùn)行中的程序都需要有自己的內(nèi)存、資源

都分配給進(jìn)程  紀(jì)錄執(zhí)行的狀態(tài) 管理自己的內(nèi)存資源

 

import os,time
print(os.getpid())
time.sleep(1000)

 

 

Multiprocess模塊(包)異步執(zhí)行,就是兩個(gè)程序一起執(zhí)行

 9)網(wǎng)絡(luò)并發(fā) 編程、進(jìn)程、線程和協(xié)程

import os

import time
from  multiprocessing import Process
def lxf(*args):
    print(args,os.getpid())
    time.sleep(2)

if __name__=='__main__':
    print(os.getpid())
    p = Process(target=lxf,args=(12,10,))
    p.start()
    print(os.getpid())

 

import os
import time
from  multiprocessing import Process
def func(num):
    print(num,os.getpid())
    time.sleep(10)
if __name__=='__main__':
    print(os.getpid())
    p = Process(target=func,args=(10,))
    p.start()
    print(os.getpid())

 

9)網(wǎng)絡(luò)并發(fā) 編程、進(jìn)程、線程和協(xié)程

import os
import time
from multiprocessing import Process
def func(num):
    print(num,os.getpid())
    time.sleep(0.5)
    print(num,os.getpid())
    time.sleep(0.5)
    print(num,os.getpid())
    time.sleep(0.5)
    print(num,os.getpid())

if __name__ =='__main__':
    print(os.getpid())
    p = Process(target=func,args=(10,))
    p.start()
    print(os.getpid())
    time.sleep(1)
    print(os.getpid(),1)
    time.sleep(1)
    print(os.getpid(),2)

 

 

 

什么是進(jìn)程: 運(yùn)行中的程序,計(jì)算機(jī)中最小的資源分配單位

程序開始執(zhí)行就會(huì)產(chǎn)生一個(gè)主進(jìn)程

Python中可以主進(jìn)程中用代碼啟動(dòng)一個(gè)進(jìn)程----------------子進(jìn)程

同時(shí)主進(jìn)程也唄稱為父進(jìn)程

父子進(jìn)程之間的代碼執(zhí)行是一步的,各自執(zhí)行自己的

父子進(jìn)程之間的數(shù)據(jù)是不可以共享

from  multiprocessing import Process
import time
n = 100
def func():
    global n
    n = 0
    print('&&&&')

if __name__ =='__main__':
    Process(target=func).start()
    time.sleep(1)
    print(n)

 

 

 

開啟多個(gè)子進(jìn)程:

from multiprocessing import Process
import time
def func(n):
    time.sleep(1)
    print('_&*'*n)

if __name__=='__main__':
    Process(target=func,args=(1,)).start()
    Process(target=func, args=(2,)).start()
    Process(target=func, args=(3,)).start()

 

 

開啟10個(gè)進(jìn)程去發(fā)郵件:

from multiprocessing import Process
import time
def func(n):
    time.sleep(1)
    print('-' * n)
if __name__ == '__main__':
    for i in range(10):
        p = Process(target=func, args=(1,))
        p.start()
    print('子進(jìn)程開始了')
    p.join()
    print('十條信息發(fā)送完了')

 

 

完善10條短信發(fā)送:

 

 

import os
import time
from  multiprocessing import Process
def func(n):
    time.sleep(1)
    print('&'*n)

if __name__=='__main__':
    l = []
    for i in range(10):
        p = Process(target=func,args=(i,))
        p.start()
        l.append(p)
    for p in l:
        p.join()
    print('發(fā)完了10條短信')

 

 

守護(hù)進(jìn)程:也是一個(gè)子進(jìn)程

當(dāng)主進(jìn)程的代碼執(zhí)行完畢之后會(huì)自動(dòng)結(jié)束的子進(jìn)程交做守護(hù)進(jìn)程

import time
from multiprocessing import Process
def deamon_func():
    while True:
        print('活著真好')
        time.sleep(0.5)

if __name__=='__main__':
    p = Process(target=deamon_func)
    p.daemon = True
    p.start()
    for i in range(3):
        print(i*'*')
        time.sleep(1)

 

 

 

 

 

 

 

守護(hù)進(jìn)程

守護(hù)進(jìn)程也是一個(gè)子進(jìn)程

當(dāng)主進(jìn)程的代碼執(zhí)行完畢之后自動(dòng)結(jié)束的子進(jìn)程叫做守護(hù)進(jìn)程

如果要在主進(jìn)程當(dāng)中要等待子進(jìn)程結(jié)束之后在執(zhí)行某段代碼:join方法

如果有多個(gè)子進(jìn)程,不能在start一個(gè)進(jìn)程之后就立刻join,吧所有的進(jìn)程放到列表中,等待所有進(jìn)程都start之后在逐一join

import os
import time
from  multiprocessing import Process
def daemon_func():
    while True:
        print('活著真好呀')
        time.sleep(0.5)

def wahaha():
    for i in range(10):
        time.sleep(1)
        print(i * '#')
if __name__=='__main__':
    Process(target=wahaha).start()
    p = Process(target=daemon_func)
    p.daemon = True
    p.start()
    for i in range(3):
        print(i*'*')
        time.sleep(1)

 

 

鎖:

例子:

import os
import time
import random
from  multiprocessing import Process

def work(n):
    print('%s:%s is runing' %(n,os.getpid()))
    time.sleep(random.random())
    print('%s:%s is done'%(n,os.getpid()))

if __name__=='__main__':
    for i in range(3):
        p = Process(target=work,args=(1,))
        p.start()

改進(jìn)一下:使用鎖:

import os
import time
import random
from  multiprocessing import Process,Lock

def work(n,lock):
    lock.acquire()
    print('%s:%s is runing' %(n,os.getpid()))
    time.sleep(random.random())
    print('%s:%s is done'%(n,os.getpid()))
    lock.release()
if __name__=='__main__':
    lock = Lock()
    for i in range(3):
        p = Process(target=work,args=(1,lock))
        p.start()

 

 

搶火車票:使用鎖:犧牲效率,但是保證安全

from multiprocessing import Process,Lock
import time,json,random
def search():
    dic = json.load(open('db'))
    print('\033[43m剩余票數(shù)%s\033[0m'%dic['count'])
def get(num):
    dic=json.load(open('db'))
    time.sleep(random.random())
    if dic['count'] >0:
        dic['count']-=1
        time.sleep(0.2)
        json.dump(dic,open('db','w'))
        print('\033[43m%s購(gòu)票成功\033[0m'%num)

def task(num,lock):
    search()
    lock.acquire()
    get(num)
    lock.release()


if __name__=='__main__':
    lock = Lock()
    for i in range(10):
        p = Process(target=task,args=(i,lock))
        p.start()

 

 

 

 

信號(hào)量:

#!/usr/bin/env python
#-*-conding:utf-8 -*-
from multiprocessing import Semaphore
sem = Semaphore(5)
sem.acquire()
print(1)
sem.acquire()
print(2)
sem.acquire()
print(3)
sem.acquire()
print(4)
sem.acquire()
print(5)  #到這里就卡住了
sem.acquire()
print(6)
sem.acquire()
print(7)

 

#!/usr/bin/env python
#-*-conding:utf-8 -*-
from multiprocessing import Process,Semaphore
import time,random
def go_ktv(sem,user):
    sem.acquire()
    print('%s 占到了一間×××包間'%(user))
    time.sleep(random.randint(3,5))# 模擬每個(gè)人在里面呆的時(shí)間不同
    sem.release()
    print('%s 走出×××包間' % (user))
if __name__=='__main__':
    sem = Semaphore(4)
    p_l=[]
    for i in range(13):
        p = Process(target=go_ktv,args=(sem,'user%s'%i,))
        p.start()
        p_l.append(p)
    for i in p_l:
        i.join()
    print('========>')

 

 

事件:

內(nèi)部?jī)?nèi)置了一個(gè)標(biāo)志

Wait 方法 如果這個(gè)標(biāo)志是True 那么wait == pass

Wait 方法 如果這個(gè)標(biāo)志是False 那么wait 會(huì)陷入阻塞,一直阻塞到標(biāo)志從False變成True

一個(gè)時(shí)間在創(chuàng)建之初 內(nèi)部的標(biāo)志默認(rèn)是False

 

紅綠燈

 

 

 

 

隊(duì)列:Queue

自己人為的去傳輸?shù)慕Y(jié)果的東西

 

import os
import time
from  multiprocessing import Queue,Process
def func(n,q):
    q.put(n*n)

if __name__=='__main__':
    q = Queue()
    Process(target=func,args=(100,q,)).start()
    print(q.get())

管道+鎖 ==隊(duì)列

管道也是一個(gè)可以實(shí)現(xiàn)進(jìn)程之間通信的模型

但是管道沒有鎖,數(shù)據(jù)不安全

 9)網(wǎng)絡(luò)并發(fā) 編程、進(jìn)程、線程和協(xié)程

數(shù)據(jù)共享:

 

 

線程:

9)網(wǎng)絡(luò)并發(fā) 編程、進(jìn)程、線程和協(xié)程啟動(dòng)線程:

import os
import time
from  threading import Thread
def func(i):
    print(os.getpid())
    time.sleep(1)
    print('thread%s'%i)



Thread(target=func,args=(1,)).start()
print(10*'*')
print('main:',os.getpid())

線程之間的數(shù)據(jù)是共享的:

9)網(wǎng)絡(luò)并發(fā) 編程、進(jìn)程、線程和協(xié)程 

實(shí)現(xiàn)線程之間并發(fā):

9)網(wǎng)絡(luò)并發(fā) 編程、進(jìn)程、線程和協(xié)程 

 

 

GIL鎖  全局解釋器鎖:

cpython解釋器的問題

在同一個(gè)進(jìn)程中 同一時(shí)刻  只能有一個(gè)線程唄cpu執(zhí)行

導(dǎo)致高計(jì)算型, 代碼 不適合用python的多線程來解決

用多進(jìn)程或者分布式來解決高計(jì)算型代碼

 

 9)網(wǎng)絡(luò)并發(fā) 編程、進(jìn)程、線程和協(xié)程

守護(hù)線程:

9)網(wǎng)絡(luò)并發(fā) 編程、進(jìn)程、線程和協(xié)程 

線程鎖

 

 

 

池的概念:

線程池:

import time
from concurrent.futures import ThreadPoolExecutor
def func(num):
    time.sleep(5)
    print(num)

t = ThreadPoolExecutor(20)
for i in range(100):
    t.submit(func,i)

t.shutdown()  #join 整個(gè)池子

print(3333335555)9)網(wǎng)絡(luò)并發(fā) 編程、進(jìn)程、線程和協(xié)程 

 9)網(wǎng)絡(luò)并發(fā) 編程、進(jìn)程、線程和協(xié)程

 

 

協(xié)程:

9)網(wǎng)絡(luò)并發(fā) 編程、進(jìn)程、線程和協(xié)程 


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI