如何等待任何套接字有数据?

时间:2016-11-16 20:28:11

标签: python sockets polling

我正在实现一个socket-client,它同时打开几个套接字。任何套接字都可能在不同的时间有数据,我想在任何套接字有数据且可读时执行代码。

我不确定如何实现这一点,我看着select.select,但似乎等待所有套接字都可读。

我想避免使用多处理来处理套接字上的数据,我希望它是从每个套接字读取的串行信号,但是当有数据可用时读取。

如何等待任何套接字可读?

public class DataController : ApiController
            {
                [HttpGet]
                public HttpResponseMessage Getdetails(string id,DateTime date_in)
                {
                    if(id==string.Empty || id==null)
                    {
                      return "Id Value Should not Empty or Null";
                    }
                    if(!Regex.IsMatch(date_in, "^(([0-9])|([0-2][0-9])|([3][0-
                    1]))\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\-
                    \d{4}$"))
                    {
                      return "Invalid Date Format";
                    }
                    List<OracleParameter> prms = new List<OracleParameter>();
                    prms.Add(new OracleParameter("id", OracleDbType.Varchar2,
                    id, ParameterDirection.Input));
                    prms.Add(new OracleParameter("date_in", OracleDbType.Date, date_in, ParameterDirection.Input));
                       string connStr = ConfigurationManager.ConnectionStrings["DtConnection"].ConnectionString;
                    using (OracleConnection dbconn = new OracleConnection(connStr))
                    {
                        DataSet userDataset = new DataSet();
                        var strQuery = "SELECT * from SAMPLE where id = :id and date_in = :date_in ";
                        var returnObject = new { data = new OracleDataTableJsonResponse(connStr, strQuery, prms.ToArray()) };
                        var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json"));
                        ContentDispositionHeaderValue contentDisposition = null;
                        if (ContentDispositionHeaderValue.TryParse("inline; filename=TGSData.json", out contentDisposition))
                        {
                            response.Content.Headers.ContentDisposition = contentDisposition;
                        }
                        return response;
            }
            }

3 个答案:

答案 0 :(得分:1)

如果您使用的是POSIX,请查看select.poll

import socket
import select
p = select.poll()
s1 = socket.socket()
s2 = socket.socket()
# call connect on sockets here...
p.register(s1, select.POLLIN)
p.register(s2, select.POLLIN)
p.poll()

答案 1 :(得分:1)

您可以使用select.select解决问题:

sockets = [sock1, sock2, sock3]
while sockets:
    rlist, _, _ = select.select(sockets, [], [])
    for sock in rlist:
        do_stuff(sock)
        sockets.remove(sock)

答案 2 :(得分:1)

如果您使用的是Python 3.4或更新版本,则标准库中会有selectors模块。它将使用系统提供的“最佳”I / O多路复用实现(select,poll,kqueue ...)文档页面末尾有一个简单的echo服务器示例https://docs.python.org/3/library/selectors.html

对于较旧的Python版本,也有backport