使用multiprocessing模块,多用于计算密集型场景
from multiprocessing import Process
def func(arg..)
代码
If __name__==”__main__”
p1=Process(target=func,args=(arg..))
p2=Process(target=func,args=(arg..))
p1.start()
p2.start()
p1.join()
p2.join()
剩余代码
单进程版本
#求素数的乘数,素数是只能被1和它自身整除的整数,单进程版本 import time start=time.time() n=0 for i in range(2,500000): for j in range(2,int(i**0.5)+1): if i%j==0: break else: n+=1 end=time.time() print(f"花费时间:{end-start}秒。找到素数:{n}个")执行结果如下:
多进程版本
#求素数的乘数,素数是只能被1和它自身整除的整数,多进程版本 import time from multiprocessing import Process def findprime(n1,n2): n=0 for i in range(n1,n2): for j in range(2,int(i**0.5)+1): if i%j==0: break else: n+=1 print(f"寻找范围:{n1}-{n2}秒。找到素数:{n}个") if __name__=="__main__": start=time.time() p1=Process(target=findprime,args=(2,210000)) #生成一个进程对象 p1.start() #启动新进程 p2=Process(target=findprime,args=(210001,350000)) p2.start() p3=Process(target=findprime,args=(350001,440000)) p3.start() p4=Process(target=findprime,args=(440001,500000)) p4.start() p1.join() #新进程执行完后回到主进程 p2.join() p3.join() p4.join() end=time.time() print(f"一共花费时间:{end-start}秒")执行结果如下:
使用threading模块,多用于IO密集型场景
from threading import Thread
def func(arg..)
代码
t1=Thread(target=func,args=(arg..))
t2=Thread(target=func,args=(arg..))
t1.start()
t2.start()
t1.join()
t2.join()
剩余代码
多线程
#获取全部股票的代码和名称 import re import requests import time from threading import Thread price=re.compile(r"price: '\d{1,3}\.\d{1,2}'") zx=["600036","000420","600666","600778","000666","000736","000635","600650","601169","601009"] def getprice(id): if id[0]=="6": url=f"http://quotes.money.163.com/0{id}.html" else: url=f"http://quotes.money.163.com/1{id}.html" try: htm=requests.get(url).text print(id,price.findall(htm)[0]) except: pass start=time.time() for i in zx: t=Thread(target=getprice,args=(i,)) t.start() t.join() end=time.time() print(f"一共花费时间:{end-start}秒")执行结果如下:
线程池
#获取全部股票的代码和名称 import re import requests import time from threading import Thread price=re.compile(r"price: '\d{1,3}\.\d{1,2}'") zx=["600036","000420","600666","600778","000666","000736","000635","600650","601169","601009"] def getprice(id): if id[0]=="6": url=f"http://quotes.money.163.com/0{id}.html" else: url=f"http://quotes.money.163.com/1{id}.html" try: htm=requests.get(url).text print(id,price.findall(htm)[0]) except: pass start=time.time() ts=[] #线程池 for i in zx: t=Thread(target=getprice,args=(i,)) t.start() ts.append(t) for i in ts: i.join() end=time.time() print(f"一共花费时间:{end-start}秒")执行结果如下:
不一定都需要join,但是这个程序需要回报。
多线程运行的顺序随机。
172.16.0.0-172.31.255.255
10.0.0.0-10.255.255.255
特殊的IP地址:127.X.X.X 127.0.0.1 本机224.X.X.X 多播地址,目标是局域网内特定的一组对象
其他的IP可以认为是互联网IP
端口地址:16位二进制数字,它的作用是在计算机中定位到一个联网的程序编程需要的地址是:IP+端口TCP通信:类似于打电话,只有接通了才能发数据,数据发完了还要断开连接,网络上大多数通信都是TCPUDP通信:类似于发短信,需要就发,不用连接,不保证数据一定能送到,适用于要求速度,不要求精度的场合,例如网络电话,在线视频客户端(发起连接)——————————————————————服务器(接受连接)
#TCP客户端 #使用说明demo4.py 服务器IP 服务器端口 import socket import sys s=socket.socket() ip=sys.argv[1] port=int(sys.argv[2]) s.connect((ip,port)) while 1: sdata=input("客户端:") s.send(sdata.encode()) if sdata=="exit": break rdata=s.recv(1024).decode() print(f"服务器:{rdata}") s.close()执行结果如下:
#TCP服务器 import socket s=socket.socket() s.bind(("0.0.0.0",6666)) #绑定地址 s.listen(5) #开启监听 sock,addr=s.accept() #接收连接 while 1: rdata=sock.recv(1024).decode() print(f"客户端:{rdata}") if rdata=="exit": break sdata=input("服务器:") sock.send(sdata.encode()) sock.close() #关闭通信管道 s.close() #关闭监听管道执行结果如下:
执行结果如下:
#UDP客户端 import socket import sys ip=sys.argv[1] port=int(sys.argv[2]) s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) print("客户端已启动") while 1: sdata=input("客户端:") s.sendto(sdata.encode(),(ip,port)) if sdata=="exit": break rdata=s.recv(1024) print("服务器:",rdata.decode()) s.close()执行结果如下: