RequestPool: initial implementation with TaskPool

This commit is contained in:
2024-02-18 16:56:31 -03:00
parent e47a0b3275
commit b0847660cc
2 changed files with 71 additions and 5 deletions

View File

@@ -1,7 +1,6 @@
{ {
"fileVersion": 1, "fileVersion": 1,
"versions": { "versions": {
"automem": "0.6.9",
"cachetools": "0.3.1", "cachetools": "0.3.1",
"d-unit": "0.10.2", "d-unit": "0.10.2",
"ddbc": "0.5.9", "ddbc": "0.5.9",
@@ -12,12 +11,10 @@
"httparsed": "1.2.1", "httparsed": "1.2.1",
"mysql-native": "3.1.0", "mysql-native": "3.1.0",
"odbc": "1.0.0", "odbc": "1.0.0",
"path-matcher": "1.1.3", "path-matcher": "1.1.4",
"requests": "2.1.3", "requests": "2.1.3",
"slf4d": "3.0.0", "slf4d": "3.0.0",
"streams": "3.5.0", "streams": "3.5.0",
"test_allocator": "0.3.4", "undead": "1.1.8"
"undead": "1.1.8",
"unit-threaded": "0.10.8"
} }
} }

69
source/net/request_pool.d Normal file
View File

@@ -0,0 +1,69 @@
module net.request_pool;
import core.thread;
import core.sync.semaphore;
import std.container;
import std.parallelism;
import requests;
import slf4d;
struct PRequest {
string url;
string method = "GET";
QueryParam[] params;
string body = "";
string contentType = "text/plain";
}
class RequestPool {
private int m_totalWorkers;
private TaskPool m_taskPool;
private Logger _l;
this(int totalWorkers = 4) {
this.m_totalWorkers = totalWorkers;
this._l = getLogger();
}
void startBackground() {
_l.debugF!"Starting RequestPool with %d workers"(this.m_totalWorkers);
this.m_taskPool = new TaskPool(this.m_totalWorkers);
}
void request(PRequest request) {
auto t = task(&this.m_run, request);
this.m_taskPool.put(t);
}
void stop() {
this.m_taskPool.finish(true);
}
private void m_run(PRequest request) {
Request rq = Request();
_l.debugF!"Requesting [%s] %s"(request.method, request.url);
Response rs;
switch (request.method) {
case "GET":
rs = rq.get(request.url, request.params);
break;
case "POST":
rs = rq.post(request.url, request.body, request.contentType);
break;
default:
errorF!"Unknown request method: %s"(request.method);
return;
break;
}
_l.debugF!"Request %s result code: %d"(request.url, rs.code);
}
}