并发网络
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并发的模块
模块:
#!/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端:
Client端:
并发编程:
一个程序在同一时刻做多件事情
基于多道批处理系统和分时系统
解决程序中IO操作影响程序的效率问题
多个程序、作业在遇到IO操作的时候,操作系统会帮助你进行切换
让cpu的利用率得到最大的提高
操作系统 只负责管理调度进程
什么叫进程:
运行中的程序:
进程:是操作系统总资源分配的最小单位
每一个运行中的程序都需要有自己的内存、资源
都分配给进程 纪录执行的状态 管理自己的内存资源
import os,time
print(os.getpid())
time.sleep(1000)
Multiprocess模块(包)异步执行,就是两个程序一起执行
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())
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)
什么是进程: 运行中的程序,计算机中最小的资源分配单位
程序开始执行就会产生一个主进程
Python中可以主进程中用代码启动一个进程----------------子进程
同时主进程也呗称为父进程
父子进程之间的代码执行是一步的,各自执行自己的
父子进程之间的数据是不可以共享
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)
开启多个子进程:
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个进程去发邮件:
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('子进程开始了')
p.join()
print('十条信息发送完了')
完善10条短信发送:
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('发完了10条短信')
守护进程:也是一个子进程
当主进程的代码执行完毕之后会自动结束的子进程交做守护进程
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)
、
守护进程
守护进程也是一个子进程
当主进程的代码执行完毕之后自动结束的子进程叫做守护进程
如果要在主进程当中要等待子进程结束之后在执行某段代码:join方法
如果有多个子进程,不能在start一个进程之后就立刻join,吧所有的进程放到列表中,等待所有进程都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()
改进一下:使用锁:
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剩余票数%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购票成功\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()
信号量:
#!/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))# 模拟每个人在里面呆的时间不同
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('========>')
事件:
内部内置了一个标志
Wait 方法 如果这个标志是True 那么wait == pass
Wait 方法 如果这个标志是False 那么wait 会陷入阻塞,一直阻塞到标志从False变成True
一个时间在创建之初 内部的标志默认是False
红绿灯
队列:Queue:
自己人为的去传输的结果的东西
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())
管道+锁 ==队列
管道也是一个可以实现进程之间通信的模型
但是管道没有锁,数据不安全
数据共享:
线程:
启动线程:
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())
线程之间的数据是共享的:
实现线程之间并发:
GIL锁 全局解释器锁:
是cpython解释器的问题
在同一个进程中 同一时刻 只能有一个线程呗cpu执行
导致高计算型, 代码 不适合用python的多线程来解决
用多进程或者分布式来解决高计算型代码
守护线程:
线程锁
池的概念:
线程池:
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 整个池子
print(3333335555)
协程:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。