LDMud的Python异步I/O包

ldmud-asyncio的Python项目详细描述


LDMud的Python异步I/O包

这是一个python模块,可以使用python异步模块 使用ldmud3.6.2及更高版本。模块不导出任何名称,它只是 扩展Python异步模块以使用LDMud。在

使用

从python包索引

安装

可以从python包索引下载efun包:

pip3 install --user ldmud-asyncio

自行构建和安装软件包

您可以自己构建包。在

首先克隆存储库

^{pr2}$

安装程序包

cd python-asyncio
python3 setup.py install --user

启动时自动加载模块

在LDMud的Python启动脚本中,添加以下行:

import ldmud_asyncio

示例

call_out()替换

importldmud,ldmud_asyncio,asyncioasyncdefdo_call_out(cb,sec):awaitasyncio.sleep(sec)cb()defefun_call_out(cb:ldmud.Closure,sec:int)->None:asyncio.run(do_call_out(cb,sec))ldmud.register_efun("py_call_out",efun_call_out)

调用程序并返回行

importldmud,ldmud_asyncio,asyncioasyncdefdo_exec(prog,cb):proc=awaitasyncio.create_subprocess_exec(prog,stdout=asyncio.subprocess.PIPE)asyncforlineinproc.stdout:cb(line.decode())awaitproc.wait()cb(0)defefun_exec(prog:str,cb:ldmud.Closure)->None:asyncio.run(do_exec(prog,cb))ldmud.register_efun("py_exec",efun_exec)

启动websockets服务器

这是websockets包中的同步示例。 这里我们只添加了一个efun来影响价值。在

这是Python代码:

importldmud,ldmud_asyncio,asyncio,websockets,jsonSTATE={"value":0}USERS=set()defstate_event():returnjson.dumps({"type":"state",**STATE})defusers_event():returnjson.dumps({"type":"users","count":len(USERS)})asyncdefnotify_state():ifUSERS:# asyncio.wait doesn't accept an empty listmessage=state_event()awaitasyncio.wait([user.send(message)foruserinUSERS])asyncdefnotify_users():ifUSERS:# asyncio.wait doesn't accept an empty listmessage=users_event()awaitasyncio.wait([user.send(message)foruserinUSERS])asyncdefregister(websocket):USERS.add(websocket)awaitnotify_users()asyncdefunregister(websocket):USERS.remove(websocket)awaitnotify_users()asyncdefcounter(websocket,path):# register(websocket) sends user_event() to websocketawaitregister(websocket)try:awaitwebsocket.send(state_event())asyncformessageinwebsocket:data=json.loads(message)ifdata["action"]=="minus":STATE["value"]-=1awaitnotify_state()elifdata["action"]=="plus":STATE["value"]+=1awaitnotify_state()finally:awaitunregister(websocket)asyncio.run(websockets.serve(counter,"localhost",6789))asyncdefdo_ws_set_value(val):STATE["value"]=valawaitnotify_state()defefun_ws_set_value(val:int)->None:asyncio.run(do_ws_set_value(val))ldmud.register_efun("py_ws_set_value",efun_ws_set_value)

下面是要在浏览器中运行的HTML代码:

<!DOCTYPE html><html><head><title>WebSocket demo</title><styletype="text/css">body{font-family:"Courier New",sans-serif;text-align:center;}.buttons{font-size:4em;display:flex;justify-content:center;}.button,.value{line-height:1;padding:2rem;margin:2rem;border:mediumsolid;min-height:1em;min-width:1em;}.button{cursor:pointer;user-select:none;}.minus{color:red;}.plus{color:green;}.value{min-width:2em;}.state{font-size:2em;}</style></head><body><divclass="buttons"><divclass="minus button">-</div><divclass="value">?</div><divclass="plus button">+</div></div><divclass="state"><spanclass="users">?</span> online
        </div><script>varminus=document.querySelector('.minus'),plus=document.querySelector('.plus'),value=document.querySelector('.value'),users=document.querySelector('.users'),websocket=newWebSocket("ws://127.0.0.1:6789/");minus.onclick=function(event){websocket.send(JSON.stringify({action:'minus'}));}plus.onclick=function(event){websocket.send(JSON.stringify({action:'plus'}));}websocket.onmessage=function(event){data=JSON.parse(event.data);switch(data.type){case'state':value.textContent=data.value;break;case'users':users.textContent=(data.count.toString()+" user"+(data.count==1?"":"s"));break;default:console.error("unsupported event",data);}};</script></body></html>

玩得开心!在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用jsoup获取标题属性   将非常大的变量从Java应用程序传递到Javascript   java lwjgl在创建字体对象时冻结   java Anylogic无法解析或不是字段   使用Java SWT在透明图像上绘制图形   java在ArrayList中查找<String>   库存管理系统上的java更新按钮不工作,MySQL,Netbeans   正则表达式如何在java中查找较大字符串中字符串s的匹配项   java在另一个片段中使用Firestore回调   java Spring AOP和AspectJ使用相同的方法   java@xmlanyement和@xmlementrefs   java Swing转换比例变更单错位   java解析XML后,应该使用哪种数据结构来存储XML的不同标记值   使用Java/Spring引导的云本地BuildPack/Paketo:如何配置不同的JDK下载uri(例如,无法访问github.com)