2015-07-22 49 views
0

它可以分为两部分:一个线程用于创建实时每五分钟一次,一旦它有新的数据,数据将被发送到连接插座。如何每五分钟向多个客户端并行发送数据

套接字连接在主线程中建立并由每个生成线程处理。以下代码给出了简要说明,目的是每隔五分钟将glb_data的值发送到所有这些连接的套接字。

import time 
from multiprocessing import Process 

class Climate(Object): 
    def update(self, glb_data): 
     while True: 
      time.sleep(5) 
      glb_data += 1 
def send_data(connection, glb_data): 
    xml_text = glb_data.encode() 
    xml_len = len(data) 
    connection.sendall(str(xml_len).encode() + b' ' +xml_text)  

if __name__ == "__main__": 
    glb_data = "" 
    cli_obj = Climate() 
    cli = Process(name="climate_data", target=cli_obj.update_data, args=(glb_data,)) 
    cli.start() 

    sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sockobj.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    print "run launchserver" 
    sockobj.bind((serverHost, eval(serverPort))) 
    sockobj.listen(5) 

    while True: 
     connection, address = sockobj.accept() 
     print('Server connected by', address) 
     handleclient = Process(name='handleclient', target=send_climate_data, args=(connection,glb_data)) 
     handleclient.start() 

的问题如下:

  1. 如何获得所有socket连接,并调用SEND_DATA功能 在产卵线程中运行。就像观察者模式一样,它将是完美的。
  2. 如何确保每个线程都收到最新的glb_data。
+0

标题很奇怪,“实时数据”和“每五分钟”似乎并不合适。 –

+0

@KlausD。也许有点奇怪,但“五分钟”和“实时”之间没有矛盾。实时只意味着您保证在指定的时间内完成 - 时间限制可能因应用程序而异。 – skyking

回答

0

为了保证每个线程及时发送最新的glb_data,您必须知道发送数据从不需要五分钟或更长时间,否则您将不得不应对这种情况。

基本上有两种方法可以做到这一点。一种是为每个套接字创建一个线程,让主线程等待主线程的信号发送数据,另一个线程创建线程,一旦主线程决定发送数据。如果您知道发送数据将在下一个数据可用之前完成,或者可以在新数据可用时中止发送旧数据(取决于操作系统的行为),但第二种解决方案最直接,如果您需要排队数据如果旧数据没有完成发送您可能会想要使用第一个解决方案。

由于第二种解决方案非常简单,我选择概述它。

def main_loop(): 
    while True: 
     data = generate_data() 
     if not data: 
      break 
     for s in sockproc: 
      if hasattr(sockproc, "process") and sockproc.process.is_alive(): 
        sockproc.process.terminate() 
      sockproc.process = Process(target = send_data, args=(sockproc.socket, data)) 
      sockproc.run() 
     sleep(300) 

其中sockproc是对象的数组具有初始属性socket是有问题的插座 - 除了属性process填充了相应的处理。函数send_data应该只在给定套接字上发送数据并返回。

请注意,我没有测试代码,因此可能有一些增强空间。

相关问题