热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

网络编程多线程/socketserver模块/threading.local

server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)server.setsockopt(socket.SOL_SOCKET,so

server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server.bind(("192.168.12.193",8085))
server.listen(5)
print("starting")
def talk(conn,addr):
"""
接收数据发送数据函数
:param conn:
:param addr:
:return:
"""
while True:
try:
data=conn.recv(1024)
if not data:break
conn.send(data.upper())
except ConnectionResetError:
break
conn.close()
while True:
conn,addr=server.accept()
t=Thread(target=talk,args=(conn,addr))
t.start()
server.close()



客户端:

import socket
custom=socket.socket()
custom.connect(("127.0.0.1",8080))
while True:
msg=input(" ").strip()
if not msg:
continue
custom.send(msg.encode("utf-8"))
data=custom.recv(1024)
print(data.decode("utf-8"))
custom.close()

守护进程和守护线程



守护进程:当主进程运行完后,不管子进程运没运行完,子进程都将立即被终止.不管有没有其他的子进程

应用:如果有多个Python项目都在运行,我们如果写一个脚本来监控这些项目,可以用守护进程的方式,zaxbit

不用守护进程的情况下:

from multiprocessing import Process
import os,time
def task():
time.sleep(2)
print("这是进程%s"%1)
if __name__ == '__main__':
t=Process(target=task)
t.start()
print('主进程')

结果:

主进程
这是进程1

使用守护进程后:

from multiprocessing import Process
import os,time
def task():
time.sleep(2)
print("这是进程%s"%1)
if __name__ == '__main__':
t=Process(target=task)
t.daemon=True #注意守护进程必须在p.start()之前设置,开启守护进程不能再开启子进程
t.start()
print('主进程')

结果:

主进程

注意:

注意守护进程必须在p.start()之前设置,
开启的守护进程不能再开启守护进程的子进程 因为进程之间是相互独立的.如果开启再开启子进程后,当守护进程停止后,没有人回收子进程.

守护进程死掉的时间: 当主进程代码执行完后,守护进程就会死掉

守护线程

注意:

守护线程必须在p.start()之前设置
开启的守护线程可以再开启守护进程的子进程,因为在同一个进程中,如果主线程死掉,子线程也会死掉
当主进程结束了,当还有其他线程执行时,守护线程会继续守护其他的线程.

列如:

from threading import Thread
import os,time
def task():
time.sleep(2)
print("这是线程%s"%1)
tt=Thread(target=time.time()) #开启子线程
print(time.time())
tt.start()
if __name__ == '__main__':
t=Thread(target=task)
t.daemon=True #守护进程必须在p.start()之前设置,守护进程不能开启子进程
t.start()
print('主线程')

结果:

主线程

守护线程死掉的时间:当进程內非守护线程都运行完后,进程就会死掉,守护线程才死掉.这也就是守护线程和守护进程的区别

from threading import Thread
import os,time
def task():
time.sleep(2)
print("这是线程%s"%1)
def task1():
time.sleep(3)
print("这是线程%s" % 2)
if __name__ == '__main__':
t1=Thread(target=task)
t2=Thread(target=task1)
t1.daemon=True #守护进程必须在p.start()之前设置,守护进程不能开启子进程
t1.start()
t2.start()
print('主线程)

结果:

主线程
这是线程1
这是线程2

threading.local

我们知道线程之间的数据是共享的,但是有没有一种技术可以让线程内的数据不共享.恰好python 为我们提供了threading.local可以实现该功能.

import threading
local=threading.local() #实例化一个全局对象
local.val='main-Thread' #在该线程下给local对象添加对象属性
def process_student():
print('%s (in%s)内存地址为%s'%(local.val,threading.current_thread().getName(),id(local.val)))
def process_thread(name):
local.val=name
process_student()
if __name__ == '__main__':
#开启两个子线程
t1 = threading.Thread(target=process_thread, args=('one',), name="Thread-A")
t2 = threading.Thread(target=process_thread, args=('two',), name="Thread-B")
t1.start()
t2.start()
t1.join()
t2.join()
print('主线程的值为%s,内存地址为%s'%(local.val,id(local.val)))#打印当前现成的额值

结果:

one (inThread-A)内存地址为1545252686736
two (inThread-B)内存地址为1545252717264
主线程的值为main-Thread,内存地址为1545252704688

从结果上看来,两个子线程并没有把local.val中的值覆盖,而是自己重新开辟了一块内存空间,来存放数据,这样就把线程之间的数据給隔离开来了.

作用: 用于保存和隔离线程之间的数据.

应用:

这个东西可以用在那些地方呢,比如下载,现在都是多线程下载了,就像酷狗那样,可以同时下载很多首歌曲,那么

就可以利用这个方法来保存每个下载线程的数据,比如下载进度,下载速度之类的

所以  如果你在开发多线程应用的时候  需要每个线程保存一个单独的数据供当前线程操作,可以考虑使用这个方法,简单有效

socketserver模块

优秀的博客

python共提供了两个socket模块

一个是:socket

另一个是socketserver 模块   简化了网络服务器的开发,解决了io问题。

SocketServer模块简化了编写网络服务程序的任务。同时SocketServer模块也 是Python标准库中很多服务器框架的基础。

这个模块提供了多进程和多线程的接口,但是多进程不能在Windows系统下用

服务端:

import socketserver
class MyTCPhandler(socketserver.BaseRequestHandler):
def handle(self):#重写handle方法
cOnn=self.request #这步相当于conn
addr=self.client_address #这步相当于addr
print(conn,addr)
while True:
try:
data=conn.recv(1024)
if not data:break
conn.send(data.upper())
except ConnectionResetError:
break
conn.close()
if __name__ == '__main__':
server=socketserver.ThreadingTCPServer(("127.0.0.1",8080),MyTCPhandler) #这一步就是做了,建立连接,开线程的工作
注意在Windows系统上不能用socketserver来开线程,在其他系统上可以用socketserver.ForkingTCPServer(("127.0.0.1",8080),MyTCPhandler)来创建

server.allow_reuse_address=True #是否允许地址的重复利用,默认为false
server.serve_forever()#一直运行

客户端:

import socket
client=socket.socket()
client.connect(('127.0.0.1',8080))
while True:
date = input(' ')
client.send(date.encode())
data = client.recv(1024)
print(' ', data.decode())
client.close()


   



推荐阅读
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • 本文介绍了使用Python编写购物程序的实现步骤和代码示例。程序启动后,用户需要输入工资,并打印商品列表。用户可以根据商品编号选择购买商品,程序会检测余额是否充足,如果充足则直接扣款,否则提醒用户。用户可以随时退出程序,在退出时打印已购买商品的数量和余额。附带了完整的代码示例。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
author-avatar
手机用户2502940247
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有