看我如何粘贴别人代码--socketserver
源码执行流程

自己模仿一个(提取代码)
服务器类
import socket
import threading
import selectors class TCPServer:
def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True): self.server_address = server_address # IP端口
self.RequestHandlerClass = RequestHandlerClass # 处理handelr
self.__is_shut_down = threading.Event()
self.__shutdown_request = False
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind(self.server_address) # 绑定IP, 端口
self.socket.listen(5) def serve_forever(self, poll_interval=0.5):
self.__is_shut_down.clear() # 清除事件标志
print("serve_forever")
try:
with selectors.SelectSelector() as selector: # 类似select的监听
selector.register(self, selectors.EVENT_READ) # while not self.__shutdown_request: # 循环去监听
print(111111111)
ready = selector.select(poll_interval)
if ready:
self._handle_request_noblock()
except:
raise def _handle_request_noblock(self):
request, client_address = self.socket.accept()
try:
self.process_request(request, client_address)
except:
self.shutdown_request(request) def process_request(self, request, client_address):
t = threading.Thread(target=self.process_request_thread,
args=(request, client_address))
t.start() def process_request_thread(self, request, client_address):
self.finish_request(request, client_address) def finish_request(self, request, client_address):
self.RequestHandlerClass(request, client_address, self) def shutdown_request(self, request):
request.colse() def fileno(self):
return self.socket.fileno()
handle
class Handle:
def __init__(self, request, client_address, server):
self.request = request # 请求
self.client_address = client_address #
self.server = server # 服务器
try:
self.handle() # 初始化时就会去执行handle()方法
finally:
self.finish() def handle(self):
pass def finish(self):
pass
ps:
fileno()方法, select实际上是监听的套接字该方法, 因为我们传入的不是套接字, 所以我们实现了该方法, 并且返回套接字的状态
threading.Event()
创建一个事件, 其中存在一个标记, 如果该标记位False时, 执行event.wait()就会阻塞
相关方法:
set() : 将标记设置为True, 并通知所有处于阻塞状态的线程恢复至运行状态
clear() : 将标记设为False
wait(timeout) : 通过标记位来判断是否阻塞
isSet() : 获取内部标志状态
示例:
# coding:utf-8 import threading
import time event = threading.Event() def chihuoguo(name):
# 等待事件,进入等待阻塞状态
print('%s %s 就位' % (threading.currentThread().getName(),name))
event.wait()
# 收到事件后进入运行状态
print('%s %s 到达终点' % (threading.currentThread().getName(), name)) # 设置线程组
threads = [] # 创建新线程
thread1 = threading.Thread(target=chihuoguo, args=("a", ))
thread2 = threading.Thread(target=chihuoguo, args=("b", )) # 添加到线程组
threads.append(thread1)
threads.append(thread2)
print("预备")
# 开启线程
for thread in threads:
thread.start() time.sleep(1)
# 发送事件通知
print('BOMB')
event.set()
selectors
selectors模块封装了select, 大概600来行, 也是一个比较简单的模块. 这里没有仔细去看.
不过这篇文章写得很详细 : https://www.cnblogs.com/zzzlw/p/9384308.html
看我如何粘贴别人代码--socketserver的更多相关文章
- 对Array.prototype.slice.call()方法的理解在看别人代码时,发现有这么个写法:[].slice.call(arguments, 0),这到底是什么意思呢?
1.基础 1)slice() 方法可从已有的数组中返回选定的元素. start:必需.规定从何处开始选取.如果是负数,那么它规定从数组尾部开始算起的位置.也就是说,-1 指最后一个元素,-2 指倒数第 ...
- log下一次改版优化别人代码的事
有次接到个PM要改版一个功能的UI设计,前端童鞋还没敲定页面的时候,我先看了看这个功能的后台,我擦...简直是惨不忍睹..对PM来说是改版UI,对我这么有点代码洁癖的来说就是优化代码. 首先我能肯定的 ...
- visual studio粘贴html代码.会自行添加一些未知代码(自动格式化)
比如我们要粘贴这样一段代码到VS这里 <option {if empty($param.is_active)}selected=selected{/if}>请选择</option&g ...
- 【Python】xpath中为什么粘贴进去代码后老报错?如何在定位元素的时候准确找到定位切入点?
1. xpath后()中双引号("")里面不能套用双引号(""),把里面的双引号改成单引号('')报错就没有了. 2.如何在定位元素的时候准确找到定位切入点? ...
- 解决Ubuntu(乌班图)vi/vim模式下粘贴的代码内容会多出的空格的问题
vi/vim模式下的粘贴 因为linux系统和win系统的差异性,有时候在win环境运行的python代码会放在Linux系统上执行,这个时候就需要把win系统上IDE上的代码copy下来,在Linu ...
- 我们为什么要看《超实用的HTML代码段》
不知道自己HTML水平如何,不知道HTML5如何进化?看这张图 如果一半以上的你都不会,必须看这本书,阿里一线工程师用代码和功能页面来告诉你每一个技术点. 都会一点,但不知道如何检验自己,看看本书提供 ...
- 面向对象的封装(粘贴Markdown代码解决缩进问题)
直接粘贴idea的代码会导致缩进错乱,建议先粘贴到记事本再粘贴到笔记!!! 1.先将属性私有化,再对外提供简单的接口可以访问内部.如set.get方法 2.set方法:修改年龄 public void ...
- Idea导入的工程看不到src等代码
问题描述: 从其他地方拷贝过来的工程,在本地导入到idea中时,展示如下的页面,里面的其他文件都看不到. 解决办法:(不知道是具体的什么原因引起的) 1. 关闭IDEA, 2.然后删除项目文件夹下的. ...
- android EditText禁止复制粘贴完整代码
<!-- 定义基础布局LinearLayout --> <LinearLayout xmlns:android="http://schemas.android.com/ap ...
随机推荐
- Linux系统编程之事件驱动
通常,我们写服务器处理模型的程序时,有以下几种模型:(1)每收到一个请求,创建一个新的进程,来处理该请求:(2)每收到一个请求,创建一个新的线程,来处理该请求:(3)每收到一个请求,放入一个事件列表, ...
- 关于npm安装报错 网络问题等等等
最近需要安装taro 结果网络各种报错 解决方法 : 1重置网络 npm config rm proxynpm config rm https-proxy 2换淘宝镜像 npm config set ...
- H5软键盘兼容方案
前言 最近一段时间在做 H5 聊天项目,踩过其中一大坑:输入框获取焦点,软键盘弹起,要求输入框吸附(或顶)在输入法框上.需求很明确,看似很简单,其实不然.从实验过一些机型上看,发现主要存在以下问题: ...
- java 枚举2
package com.wsy.test; public enum Color { RED("红色",1),GREEN("绿色",2),BLUE("蓝 ...
- oracle篇 之 组函数
一,常见组函数 1 . avg:求平均值,操作数值类型 2.sum:求和,操作数值类型 3.min:求最小值,操作任意类型 4.max:求最大值,操作任意类型 select avg(salary),s ...
- noip2017部分题目
D1T3 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张NN个点MM条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,NN号点是公园的出口,每条边有一个非负权值, 代表策策经过 ...
- form组件+cookie+session总结
1.forms 组件 -数据校验功能 1.定义 -新建一个py文件 -导入from django import forms -写一个类继承 forms.Form -把你需要校验的(字段的条件)属性写到 ...
- [HNOI2001] 产品加工
题目类型:\(DP\) 传送门:>Here< 题意:有\(N\)个零件,每个零件有三种选择,在\(A\)机器加工,在\(B\)机器加工,同时在\(AB\)加工.其中所需要的时间分别为\(t ...
- 【dp】友好城市
题目一: [题目描述] Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市.北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同. 每对友好城市都 ...
- HAOI2019+十二省联考 游记
Day1 T1 考前还奶了一口不会考01Trie的,也就没有学,然后60分BOOM T2 不会SAM,告辞,30分滚粗 T3 传统实现题答?2p,2u,2g分别对应素数,莫比乌斯函数,原根?没看出来, ...