(一)并发和并行的深入理解
1、并发和并行 (1)并发:在同一段时间中多个进程和进程在运行,并且这些进程和线程都在同一个处理机上运行。 (2)并行:在同一时刻执行多个程序(在一个以上的处理机的情况下进行,在Linux系统下线程不可能发生并发)
(二)多进程
1、进程的概念:进程就是执行中的程序(程序的一次执行)。 2、特点:(1)计算机程序只存储在磁盘上的可执行二进制文件中,只有把他们加载到内存中并被操作系统调用,才拥有其生命周期。(2)每个进程都有自己的地址空间、内存、数据栈以及以及其他用于跟踪执行的辅助数据。 (3)操作系统管理所有进程的执行,并且为它们分配合理的时间和标记编号。3、多进程并行的条件:总进程的数量不多于cpu的核心数量。
代码实例:
1、模仿耗时函数
import time
import random
def fun():
print(‘你好’)
time.sleep(random.randint(1,3))
if __name__=='__main__':
start_time=time.time()
fun()
fun()
end_time=time.time()
print('执行此函数消耗了%s的时间'%(start_time-end_time))
2、模仿多进程耗时函数(无参函数)
import time
import random
from multiprocessing import Process
def fun():
print(‘你好’)
time.sleep(random.randint(1,3))
if __name__=='__main__':
start_time=time.time()
process1=Process(target=fun)
process2=Process(target=fun)
process1.start()
process2.start()
fun()
end_time=time.time()
print('执行此函数消耗了%s的时间'%(start_time-end_time))
3、模仿多进程耗时函数(有参函数)
import time
import random
from multiprocessing import Process
def fun(a,b):
r=a+b
print(r)
print(‘你好’)
time.sleep(random.randint(1,3))
if __name__=='__main__':
start_time=time.time()
process1=Process(target=fun,args=(2,2))
process2=Process(target=fun,kwargs={'a':2,'b':2})
process1.start()
process2.start()
fun()
end_time=time.time()
print('执行此函数消耗了%s的时间'%(start_time-end_time))
(三)多线程
1、概念:线程是程序执行流的最小单元。多任务可以由多进程完成,也可以由一个进程中的多线程完成。一个进程可以由多个线程组成,并且至少有一个线程(主线程)。2、当其他线程运行时,当前线程可以被抢占(中断)和临时挂起(也称为睡眠)。 3、在Python中,线程的调度不是由操作系统负责的,而是由Python解释器负责的。 4、GIL (全局解释性锁) (1)在Python中,设计一个GIL是为了设计方便和线程安全。这个锁要求在任何进程中,一次只能有一个线程执行。 (2)在Python中,线程只能实现并发,不能实现并行(不能为多个线程分配多个cpu) (3)GIL在任何IO阻塞的时候,会自动切换线程。
(四)实现并发服务器
1、多进程实现并发服务器
import socket
import os
import multiprocessing
server=socket.socket()
server.bind((' ',端口号))
server.listen(567)
def task(soc):
while True:
recv_data=soc.recv(1024)
if recv_data:
print(recv_data.decode())
soc.send(recv_data)
else:
break
soc.close()
while True:
conn,adrr=server.accept()
process=multiprocess.Process(target=task,args=(conn,))
process.start()
2、多线程实现并发服务器
import socket
from threading import Thread
server=socket.socket()
server.bind((' ',端口号))
server.listen(567)
def task(soc):
while True:
recv_data=soc.recv(1024)
if recv_data:
print(recv_data.decode())
soc.send(recv_data)
else:
break
soc.close()
while True:
conn,adrr=server.accept()
thread=.Thread(target=task,args=(conn,))
thread.start()
网友评论