直接上代码

import sys
from typing import Dict, List from aiohttp import web
import asyncio
from functools import wraps
from blinker import Signal from PySide6 import QtCore as qc
from PySide6 import QtGui as qg
from PySide6 import QtWidgets as qw def get(path):
def _f1(fn):
@wraps(fn)
async def _f2(self: "Routes", *args, **kw):
async with self.lock:
self.count += 1
if self.count >= self.max:
self.max = self.count
ret = await fn(self, *args, **kw)
async with self.lock:
self.count -= 1
return ret _f2.path = path
_f2.method = "get"
return _f2 return _f1 class Routes:
def __init__(self, app: web.Application) -> None:
self.lock = asyncio.Lock()
self.count = 0
self.max = 0
self.add_routes(app) @get("/")
async def get_g1(self, request):
return {1: 2, 2: 3, 3: "中国"} def add_routes(self, app: web.Application):
get_lst = [] for name in self.__dir__():
if name.startswith("get_"):
att = getattr(self, name)
if callable(att):
assert hasattr(att, "path")
assert hasattr(att, "method")
path = getattr(att, "path")
get_lst.append(web.get(path, att))
app.add_routes(get_lst) async def logger_mdw(app, handler):
async def _h1(request: web.Request):
print(request.method, request.path)
return await handler(request) return _h1 async def reponse_mdw(app, handler):
async def _h1(request: web.Request):
ret = await handler(request)
print(type(ret))
if isinstance(ret, web.Response):
print(3)
return ret
elif isinstance(ret, (str, int, float)):
print(1)
return web.Response(text=str(ret))
elif isinstance(ret, (Dict, List)):
return web.json_response(ret) else:
print(4)
return web.Response(text=str(ret)) return _h1 class sv(qc.QObject):
sg = Signal() def __init__(self, loop: asyncio.AbstractEventLoop, ft: asyncio.Future) -> None:
super().__init__()
self.loop = loop
self.ft = ft async def run_server(self): server = web.Application()
server.middlewares.append(logger_mdw)
server.middlewares.append(reponse_mdw)
Routes(server)
runner = web.AppRunner(server)
# 3---------------------------------- await runner.setup()
site = web.TCPSite(runner, "127.0.0.1", 8080) await site.start() print(f"======= Serving on http://{site._host}:{site._port}/ ======") return site async def server_container(self):
site = await self.run_server()
await self.ft # 等待约定的信号传过来
await site.stop()
self.sg.send() def start(self):
self.loop.run_until_complete(self.server_container()) def stop(self):
self.loop.call_soon_threadsafe(self.ft.set_result, None) class newth(qc.QThread):
v: sv def run(self):
loop = asyncio.new_event_loop()
ft = asyncio.Future(loop=loop) self.v = sv(loop, ft)
self.v.moveToThread(self) try:
self.v.start()
except Exception as e:
print(e)
finally:
print("server finished ..........") def stop(self):
if hasattr(self, "v") and self.v is not None:
self.v.stop() class mw(qw.QDialog):
def __init__(self) -> None:
super().__init__()
ly = qw.QHBoxLayout()
self.setLayout(ly)
self.b1 = qw.QPushButton("start") self.b1.clicked.connect(self.on_b1_clicked)
ly.addWidget(self.b1)
self.resize(200, 200)
self.th = None def on_b1_clicked(self):
self.b1.setEnabled(False)
if self.th is None:
self.th = newth()
self.th.started.connect(self.b1_update)
self.th.finished.connect(self.b1_update)
self.th.start()
else:
self.th.stop() def b1_update(self):
if self.th is None or self.th.isFinished():
self.th = None
self.b1.setEnabled(True)
self.b1.setText("start")
else:
self.b1.setEnabled(True)
self.b1.setText("stop") def closeEvent(self, arg__1: qg.QCloseEvent) -> None:
if self.th is not None:
self.on_b1_clicked()
arg__1.ignore() else:
arg__1.accept() if __name__ == "__main__": app = qw.QApplication()
ss = mw()
ss.show()
app.exec()
sys.exit()

200 行 ,一个PYQT 窗口 + 后台 AIOHTTP 服务 , 例子的更多相关文章

  1. 200行代码实现RPC框架

    之前因为项目需要,基于zookeeper和thrift协议实现了一个简单易用的RPC框架,核心代码不超过200行. zookeeper主要作用是服务发现,thrift协议作为通信传输协议, 基于com ...

  2. 只用200行Go代码写一个自己的区块链!

    Coral Health · 大约23小时之前 · 220 次点击 · 预计阅读时间 7 分钟 · 不到1分钟之前 开始浏览 区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大 ...

  3. 只用200行Go代码写一个自己的区块链!(转)

    区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Go 语言来实现一个简单的区块链,用不到 200 行代码来揭示区块链 ...

  4. SpringBoot,用200行代码完成一个一二级分布式缓存

    缓存系统的用来代替直接访问数据库,用来提升系统性能,减小数据库复杂.早期缓存跟系统在一个虚拟机里,这样内存访问,速度最快. 后来应用系统水平扩展,缓存作为一个独立系统存在,如redis,但是每次从缓存 ...

  5. java在线聊天项目0.8版 实现把服务端接收到的信息返回给每一个客户端窗口中显示功能

    迭代器的方式会产生锁定 服务器端增加发送给每个客户端已收到信息的功能 所以当获取到一个socket,并打开它的线程进行循环接收客户端发来信息时,我们把这个内部类的线程Client保存到集合List&l ...

  6. 部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用

    前面介绍了很多关于ABP框架的后台Web API 服务端,以及基于Vue+Element前端应用,本篇针对两者的联合部署,以及对部署中遇到的问题进行处理.ABP框架的后端是基于.net core5.0 ...

  7. 第一个PyQt程序

    这个程序虽然小,具备pyqt程序的皱型,可以作为一个模板使用了 #!/usr/bin/python3 # -*- coding: utf-8 -*- import sys from PyQt5.QtW ...

  8. (7)nehe教程1 创建一个OpenGL窗口:

    不要用那个nehe ndk了 误人子弟! 转自: 一个窗口,代码可真多啊 http://www.yakergong.net/nehe/ 在这个教程里,我将教你在Windows环境中创建OpenGL程序 ...

  9. 简单的.NET后台定时服务框架

    后台服务只要是有一定经验的开发人员都接触过,其中离不开服务创建,调度逻辑处理,业务逻辑编写等环节.往往我们在新建一个后台服务项目的时候都会去拷贝以前的代码,再写一些线程等方式去完成,然后又去处理服务的 ...

  10. 200行代码,7个对象——让你了解ASP.NET Core框架的本质

    2019年1月19日,微软技术(苏州)俱乐部成立,我受邀在成立大会上作了一个名为<ASP.NET Core框架揭秘>的分享.在此次分享中,我按照ASP.NET Core自身的运行原理和设计 ...

随机推荐

  1. Ubuntu安装完VMware tools还是不能和主机之间拖拽文件

    Ubuntu安装完VMware tools还是不能和主机之间拖拽文件 1.确保已安装了VMware Tools 2.禁用 Wayland sudo gedit /etc/gdm3/custom.con ...

  2. 传入一个List集合,返回分页好的数据

    传入一个List集合,返回分页好的数据. 定义分页信息类: package com.cn.common; import java.util.List; public class CommonPage& ...

  3. 我的书《Unity3D动作游戏开发实战》出版了

    首先感谢帮助和参与前期检阅的朋友们.本书是我经验积累的提炼,书中既有干货分享也有对基础内容的详解补充. 同时由于是第一次撰写书籍,许多地方仍有不足还请读者朋友们见谅. 在京东或当当等都可以购买到本书: ...

  4. kubernets之高级调度

    一 节点的污点以及pod的容忍度以及节点的亲缘性对比 1.1 首先需要介绍的是节点的污点以及pod的污点容忍度 污点是节点的属性,容忍度是pod的属性,只有当一个pod的容忍度包含节点的污点,pod才 ...

  5. 必应每日一图url(可直接使用)

    必应每日一图url 首先放出地址,后面是一堆心路历程(一堆废话),只为链接的可以不用看 https://baotangguo.cn:8081/ 最初 ​ 博客园装饰的时候(虽然是抄的),想着上面背景图 ...

  6. webview2 示例 Samples Selenium

    https://github.com/MicrosoftEdge/WebView2Samples https://learn.microsoft.com/zh-cn/microsoft-edge/we ...

  7. .NET周刊【5月第4期 2024-05-26】

    国内文章 开源低代码框架 ReZero API 正式版本发布 ,界面操作直接生成API https://www.cnblogs.com/sunkaixuan/p/18201175 ReZero是一款. ...

  8. SDWebImageCache缓存分析

      文字版本:  https://docs.qq.com/doc/DRVpPS3BBV3l0bEZ5  

  9. js重复赋值 js数据交换 js调式方法

    重复赋值 对一个变量,对此赋值,存储数据 定义变量时对变量初始化 此时js语法规定,必须带有关键词var 或者let 或者const 之后使用变量时,不需要带有关键词 第一次定义变量,初始化变量,必须 ...

  10. 机器学习算法(一):1. numpy从零实现线性回归

    系列文章目录 机器学习算法(一):1. numpy从零实现线性回归 机器学习算法(一):2. 线性回归之多项式回归(特征选取) @ 目录 系列文章目录 前言 一.理论介绍 二.代码实现 1.导入库 2 ...