Python基础——多线程、线程池、网络基础知识、TCP编程、UDP编程

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()

执行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值