Workers RPC现已支持跨Python和JavaScript调用
内容提要
Cloudflare Workers RPC现已支持跨语言调用,JavaScript和Python Worker可互相调用方法、传递对象和函数,无需额外依赖或配置。系统通过Pyodide FFI和自定义类型转换层实现无缝集成,支持结构化类型转换、异常传播和函数传递。开发者可轻松在JavaScript中调用Python包(如Pygments),实现多语言系统构建,性能接近本地调用。
延伸解读
跨语言RPC的实现机制
该功能通过Pyodide的FFI和自定义类型转换层实现。Pyodide FFI自动转换Python和JavaScript的内置类型,如数字、布尔、字典和数组,对于自定义类或函数则创建代理对象。此外,workers-runtime-sdk包专门处理Request、Response等Web API对象,将其转换为Python原生形式,避免开发者直接操作JavaScript代理。
实际应用场景
文章展示了从JavaScript Worker调用Python的Pygments包进行语法高亮的例子。开发者只需在Python Worker中定义方法,并通过Service绑定在JavaScript中调用,无需额外依赖或配置。这为多语言系统构建提供了便利,使得跨语言调用如同使用本地库一样简单。
性能与限制
文章指出,RPC调用通常不跨网络,而是在同一线程内执行,因此性能开销接近本地调用。但需要注意的是,跨语言调用涉及类型转换,对于非标准类型可能通过代理处理,这可能会带来一定的性能影响。此外,异常会传播到调用方,但具体错误处理细节需参考文档。
Q&A
Cloudflare Workers RPC现在支持哪些语言之间的调用?
Cloudflare Workers RPC现在支持JavaScript和Python之间的跨语言调用,JavaScript Worker和Python Worker可以互相调用方法、传递对象和函数。
如何在JavaScript Worker中调用Python Worker的方法?
在JavaScript Worker中,通过Service binding获取Python Worker的RPC stub,然后像调用本地函数一样调用其方法。例如,如果Python Worker暴露了highlight_code方法,可以在JavaScript中通过env.PYTHON_RPC.highlight_code(code, language)来调用。
跨语言RPC调用时,JavaScript的Date类型会转换成Python的什么类型?
JavaScript的Date类型在跨语言RPC调用中会转换为Python的datetime类型。
跨语言RPC的性能开销如何?
跨语言RPC调用通常不会跨越网络,因为另一个Worker通常与调用者在同一线程中运行,因此性能开销接近零,与在同一Worker中运行代码相当。
跨语言RPC是如何实现类型转换的?
跨语言RPC的类型转换主要依靠Pyodide的Foreign Function Interface (FFI)和自定义的workers-runtime-sdk转换层。Pyodide FFI自动转换Python和JavaScript的内置类型,对于自定义类型则创建代理对象;workers-runtime-sdk则专门处理Cloudflare Workers特有的对象(如Request、Response等),将它们转换为Python原生类型。
是否可以在JavaScript Worker中使用Python的包?
可以。通过Python Worker暴露方法,JavaScript Worker可以调用这些方法,从而使用Python包的功能。例如,可以使用Pygments包进行语法高亮,JavaScript Worker只需调用Python Worker中封装好的highlight_code方法即可。
跨语言RPC支持传递函数吗?
支持。可以将JavaScript函数传递给Python Worker,也可以将Python函数传递给JavaScript Worker,当对方调用该函数时,会发起一个新的RPC调用。
跨语言RPC的异常处理是怎样的?
跨语言RPC调用中的异常会被传播,并在调用RPC方法的位置抛出。例如,在JavaScript中调用Python方法时,如果Python方法抛出异常,JavaScript端会收到该异常。