我已经构建了一个非常简单的TCP服务器(在python中),当查询时,返回运行该脚本的主机操作系统的各种系统级统计信息。
作为我获得python及其可用库知识的实验和目标的一部分;我想构建一个管理接口,a)绑定到一个单独的TCP套接字b)接受来自LAN的远程连接,c)允许连接的用户发出各种命令。 Varnish应用程序是一个提供类似管理功能的工具示例。
我对线程的了解有限,我正在寻找有关如何完成类似以下内容的指示:
用户连接到管理端口(telnet remote.host 12111),并发出“SET LOGGING DEBUG”或“STOP SERVICE”。
我的困惑与如何在线程之间共享数据有关。如果服务是以例如thread-1启动的,那么如何从该线程访问数据?
或者,提供此类功能的python应用程序列表将是一个很大的帮助。我很乐意戳代码,以便重用他们的想法。
答案 0 :(得分:1)
python包含一些多线程服务器(SocketServer
,BaseHTTPServer
,xmlrpclib
)。您可能也想看看Twisted,它是一个强大的网络框架。
答案 1 :(得分:0)
最简单的起点可能涉及Python的xmlrpclib。
关于线程,所有线程都可以读取Python程序中的所有数据;一次只有一个线程可以修改任何给定的对象,因此列表和dicts等基元将始终处于一致状态。涉及多个原语的数据结构(即类对象)将需要更多的关注。线程之间协调的最安全方法是通过类似Queue.Queue之类的东西在线程之间传递消息/命令。这并不总是最有效的方式,但它不太容易出问题。
答案 2 :(得分:0)
最好使用multiprocessing库,它为并行计算(队列,管道......)提供了一整套功能。 由于GIL带来的限制,python中的多线程效率不高。
multiprocessing是一个使用类似于线程模块的API支持产生进程的包。多处理包提供本地和远程并发,通过使用子进程而不是线程有效地侧向执行全局解释器锁。因此,多处理模块允许程序员充分利用给定机器上的多个处理器。它可以在Unix和Windows上运行。
GIL存在争议,因为它可以防止多线程CPython程序在某些情况下充分利用多处理器系统。