Python:传递时始终监听并执行数据

时间:2014-04-30 19:28:50

标签: python asynchronous listener

我做了一些研究,但是如果有两个用户发送了数据,我似乎无法找到办法,但Python脚本只能处理一个。

这通常是脚本的工作原理:

1) User Enters Data '123' 2) Python listener executes on Data | | Sends requests to server and retrieves data (typically ~1 min) | Script writes to HTML files | 3) Finishes writing to files, waits for more User input

现在的问题是,如果另一个用户在该步骤2 - 3阶段输入数据,则该脚本不再侦听,并且不会对此数据执行任何操作。

无论如何,我可以让它始终监听更改,一旦完成,将其传递给自己的类或其他实体,以便它可以继续侦听另一个异步更改?

修改

  • 用户在网站上输入数据,然后将其写入文本文件。
  • Python脚本当前检查此文件中的最后修改行,以查看它是否与上一次检查不同。如果此检查结果为true,则使用修改后的行
  • 执行该类

2 个答案:

答案 0 :(得分:0)

您正在描述客户端 - 服务器架构。

当您假设多个客户端使用相同的服务时,您必须允许某种多处理。

Web服务器是典型的例子,但还有很多其他的。

在您的任务中,需要以下角色:

  • 客户:执行请求并期待一些回复
  • 服务器:接受请求并管理其处理,从而将响应发送回客户端
  • worker:服务器上的一个组件,负责执行"实际工作"

你所描述的似乎是所有这些的混合物。当你编写代码时,你通常会开始考虑一个脚本,这就是后来最终在工作中的内容。

在设计解决方案时,您必须决定通信技术。有任何选择,有些是:

  • http - 典型的Web服务器,Python提供了许多框架
  • TCP套接字 - 相当低级别,但在Python中也得到很好的支持
  • zeromq - 基于TCP或unix套接字,由pyzmq软件包支持

您必须编写所有三个部分 - 客户端,服务器和工作人员。

基于zeromq的客户端服务器解决方案的一个简单示例在我的回答Distributed lock manager

答案 1 :(得分:0)

虽然我仍然不确定为什么你没有服务器本身处理这个,但是我从Python脚本处理它的建议是使用multiprocessing模块。这是使用单个工作进程处理此问题的一种非常基本的方法:

from multiprocessing import Queue, Process
import multiprocessing

def worker(e, m):
    while True:
       e.wait() # Wait to be told the file has changed. This will block.
       e.clear()  # Clear the flag so the main thread can set it again if changes happen while we process
       # Send request to server, retrieve data
       # Write to HTML files

def watch_file_for_changes():
    while True:  
       if file_changed: # Use whatever watching mechanism you already have for this; inotify, etc.
          e.set() # Tell the worker to process the file. This unblocks e.wait()

if __name__ == "__main__":
   e = Event()
   # Start some workers. You can choose whatever number you want.
   p = multiprocessing.Process(target=worker, args=(e,))
   p.start()
   watch_file_for_changes()

这是完全未经测试的,需要一些清理,但应该给你一般的想法。这也假设您的工作人员足够聪明,可以确定是否已在文本文件中添加了多个新条目。