Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d1c36d1848 |
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