wip
This commit is contained in:
67
source/net/request_pool.d
Normal file
67
source/net/request_pool.d
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user