第三方数据供应商把数据和python封装到一起,只能通过调用 python方法来实现数据查询,如果可以通过node 简单封装下实现 python 方法调用可以快速上线并节省开发成本。

最简单粗暴的通信方式是 nodejs调用一下 python 脚本,然后获取子进程的输出,但是由于每次 python 启动并加载数据包的过程比较漫长,所以对该过程优化。

进程通信

index.py

index.js

通过child_process.spawn来派生 python 子进程,监听 stdout 输出。上述方式也是官方文档中的示例,目前该示例存在两个问题:

  • nodejs 没有向 python 发送数据
  • nodejs 调用完毕后,python 子进程会退出;下次查询需要再次调用python命令进行加载文件,查询数据;无法实现一次内存加载,多次使用。

进程双向通信

保证一次数据加载,多次使用的前提是 python 进程启动后不能退出。python 进程之所以退出是因为无事可做,所以常见的手段有循环,sleep,监听端口,这些手段可以翻译成同步阻塞任务,同步非阻塞任务,其中代价最小的就是同步非阻塞任务,然后可以想到 linux 的 select,epoll,简单搜索了下 python 的 epoll,好像还有原生的包。

index.py – 通过 epoll 监听 stdin

index.js – 通过 stdin 发送数据

python 与 nodejs 通过 stdio 实现通信; python 通过 epoll 监听 stdin 实现驻留内存,长时间运行。

存在问题

  • nodejs 把标准输出作为执行结果,故 python 端只能把执行结果写入标准输出,不能有额外的打印信息
  • nodejs 端标准输入没有 flush 方法,所以 python 端事件触发不够及时,目前通过在nodejs端定时发送空信息来 hack 实现
  • buffer 没法动态扩容,没有c语言的指针好用,在解析 stdout 时写丑

总结

虽然可以实现 nodejs 和 python 的双向通信,然后由于上述种种问题,在这里并不推荐使用这种方式,通过 http 或 socket 方式比这个香多了。

到此这篇关于nodejs与python 双向通信的实现代码的文章就介绍到这了,更多相关nodejs与python双向通信内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!