Compare commits

1 Commits
master ... wip

Author SHA1 Message Date
d1c36d1848 wip 2024-02-16 18:16:38 -03:00

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

@@ -0,0 +1,67 @@
module net.request_pool;
import core.thread;
import core.sync.semaphore;
import std.container;
import std.uuid;
import requests;
import slf4d;
struct PRequest {
string method = "GET";
string url;
string[string] params;
UUID uuid; /// Used internally
}
class RequestPool {
private int m_totalWorkers;
private ThreadGroup m_threads;
private bool m_shouldRun = false;
private Semaphore m_semaphore;
protected DList!PRequest m_requestsQueue;
this(int totalWorkers = 4) {
this.m_totalWorkers = totalWorkers;
this.m_semaphore = new Semaphore();
}
void startBackground() {
debugF!"Starting RequestPool with %d workers"(this.m_totalWorkers);
this.m_shouldRun = true;
for (int i = 0; i < this.m_totalWorkers; i++) {
Thread t = new Thread(() => this.m_run(i));
this.m_threads.add(t);
}
}
void enqueue(PRequest request) {
request.uuid = randomUUID();
this.m_requestsQueue.insertBack(request);
this.m_semaphore.notify();
}
void stop() {
this.m_shouldRun = false;
this.m_threads.joinAll();
}
private void m_run(immutable int tid) {
Request rq = Request();
while (this.m_shouldRun) {
this.m_semaphore.wait();
PRequest request = this.m_requestsQueue.front();
this.m_requestsQueue.removeFront();
debugF!"Requesting %s with tid %d"(request.url, tid);
Response rs = rq.execute(request.method, request.url);
}
}
}