1.线程与进程
- 一个运行中的程序。
- 进程中运行的子任务叫线程。
2.多进程
使用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}秒")
执行结果如下:
3.多线程
使用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,但是这个程序需要回报。
多线程运行的顺序随机。
4.网络基础知识
- IP地址:32位二进制数字,常见的形式是192.168.0.X它的作用是在网络中定位到一个计算机
- 局域网使用的IP地址:192.168.0.0-192.168.255.255
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通信:类似于打电话,只有接通了才能发数据,数据发完了还要断开连接,网络上大多数通信都是TCP
- UDP通信:类似于发短信,需要就发,不用连接,不保证数据一定能送到,适用于要求速度,不要求精度的场合,例如网络电话,在线视频
5.TCP编程
客户端(发起连接)——————————————————————服务器(接受连接)
#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() #关闭监听管道
执行结果如下:
6.UDP编程
#UDP服务器
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('0.0.0.0',9999))
print("服务器已启动")
while 1:
rdata,addr=s.recvfrom(1024)
print(f"客户端{addr}:{rdata.decode()}")
if rdata==b"exit":
break
sdata=input("服务器:")
s.sendto(sdata.encode(),addr)
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()
执行结果如下: