直接上代码

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. 超轻量级的c#版基于文件的日志记录工具,可定制输出格式,可指定日志文件

    这是我自己个人编写的日志记录,主要使用在只需要记录日志,偶尔到文件中查看一下日志记录的情况.我自己写的一些服务之类的是使用了这个的,代码很少,使用很简单. 第一步 搜索和安装我的Nuget包 搜索和安 ...

  2. Linux中的man page指令

    以Linux上的date命令为例,在控制台输入 man date,将会展示如下界面: [vbird@www ~]$ man date DATE(1) User Commands DATE(1) # 请 ...

  3. 4G EPS 第四代移动通信系统

    目录 文章目录 目录 4G EPS 4G EPS 4G(the 4th generation mobile communication technology,第四代移动通信技术)提供了 3G 不能满足 ...

  4. typora不支持mermaid 问题记录

    typora不支持mermaid 问题记录 注意: 使用不了最新版本js,目前我测的最高版本9.3,有些复杂的图表不能用,不过已经满足我使用的需求了.知足了 本文只做记录,如有问题请联系删除!!!感谢 ...

  5. openstack以后需要研究一下的知识

    1. openvt是一个用于在虚拟终端上启动程序的命令行工具.它允许用户在一个新的虚拟终端(VT)上启动一个程序,并将标准输入.输出和错误输出定向到该终端. openvt的用法如下: 打开一个虚拟终端 ...

  6. 终于搞懂了!原来 Vue 3 的 generate 是这样生成 render 函数的

    前言 在之前的 面试官:来说说vue3是怎么处理内置的v-for.v-model等指令? 文章中讲了transform阶段处理完v-for.v-model等指令后,会生成一棵javascript AS ...

  7. 解决”将公司Linux服务器上的脚本导出到windows上打开串行的“问题

    目录 一.前期准备 二.回车转换 一.前期准备 1.在linux服务器上写一个简单的脚本. [root@node5 ~]# vim linux脚本.sh [root@node5 ~]# cat lin ...

  8. 解密Prompt系列30. LLM Agent之互联网冲浪智能体

    这一章我们介绍能自主浏览操作网页的WebAgent们和相关的评估数据集,包含初级任务MiniWoB++,高级任务MIND2WEB,可交互任务WEBARENA,多模态WebVoyager,多轮对话Web ...

  9. nginx源码安装步骤

    1.安装依赖包 yum install -y gcc yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install ...

  10. 记一例UIView突然不显示的排查过程

    一.现象 今日在开发中遇到一个诡异问题,一个自定义的AlertView在显示之后瞬间在屏幕上消失,但是其对象在内存中依然存在 二.排查 通过lldb命令查询到view.superview.superv ...