python学习---2 (rpyc)

本文介绍了如何在Python中使用rpyc进行异步调用,包括基本的异步调用流程、回调函数以及事件通知机制。同时,探讨了rpyc自带的经典服务器classic_server.py和注册服务器registry_server.py的功能,如模块访问、DNS服务的简化。此外,还讨论了rpyc的认证机制和不同类型的服务器,如ThreadedServer和ForkingServer,以及处理返回值的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我想会有新手像我一样得到了代码也不知道怎么去实验,嘿嘿。。别着急


我是用ubuntu的,所以开一个终端 启动一下server端,在开一个终端窗口执行client端就OK了


异步调用基本使用过程:
async_function_obj=rpyc.async(c.root.get_time) #关联一个异步对象到目标函数
result_obj=async_function() #通知服务端在适当的时候调用目标函数
if result_obj.ready: #查询服务端是否已经完成了函数调用
print result_obj.value #打印函数返回值

回调函数:让服务端在完成目标函数调用后,调用一个客户端函数。此时客户端将自己的一个函数对象传递给服务端函数作为一个参数,服务端函数完成工作后调用此函数。
事件通知:客户端如果不处理任何返回值,可以作为事件通知机制,通知服务端运行某函数。

(异步的工作交与服务端处理了。)

rpyc/servers/classic_server.py
rpyc/servers/registry_server.py
内置的两个工具这个就有点像Django的工具一样的!

registry-server类似于dns服务器,简化了对rpyc服务所在ip、端口的记忆。
在一个局域网中只需要一个此服务,一旦局域网中有一个主机运行了registry-server.py,那么我们就可以使用名字来连接服务。
将IP与端口与域名进行了绑定处理。

RPYC—自带服务—classic_server.py
提供的功能:
eval
execute
modules
使用:c.root.eval或c.eval(对classic_server特例)来访问
客户端访问:
c=rpyc.classic.connect(“localhost”) #连接
c.modules.os.system(‘ls’) #用modules可访问任何服务端库
c.eval(‘1+23’) #简单python语句执行

认证:
(在编写RMI程序的时候就需要有一个认证的过程)
1:
服务端提供:
def exposed_login(user,pass) 函数
def exposed_logout()函数
其他exposed函数中检查用户是否登录,没有登录则直接返回。

RPYC提供了两个服务:
ThreadedServer
ForkingServer

服务可调用函数有:
start
register
unregister
close
fileno


server端代码实例:
# coding:utf-8  
  
from rpyc import Service  
from rpyc.utils.server import ThreadedServer
 
class TestService(Service):  
    # 对于服务端来说, 只有以"exposed_"打头的方法才能被客户端调用,所以要提供给客户端的方法都得加"exposed_"  
    def exposed_test(self, num): 
        return 1+num  

         
    
sr = ThreadedServer(TestService, port=9911, auto_register=False)  
sr.start()

client端代码实例:

# coding:utf-8  
  
import rpyc  
  
# 参数主要是host, port  
conn =rpyc.connect('localhost',9911)  
# test是服务端的那个以"exposed_"开头的方法  
cResult =conn.root.test(1)  
conn.close()  
  
print cResult

注:对于返回值cResult
1、如果cResult是数字或字符串的话,那么在conn.close()之后,你可以用cResult的值
2、如果cResult是其它类型的数据的话, 你conn.close()之后,cResult就为空的了(这是因为对于其它类型的返回值,服务端返回的是rpyc.netref的封装nobj, 当访问nobj时,它连接到服务端,取值,并返回给客户端,你close之后就连不到服务端了),所以最好在服务端把计算结果处理下,转换成数字或字符串(对于大字典来说,可以用json转换下,然后客户端再转过来就ok了)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值