我正在实现一个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;
}
}
答案 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。