libevent
是否有办法使用bufferevents
API限制内存使用量或未完成的未写入数据?或者,当libevent耗尽内存时会发生什么?
我的应用程序从文件中读取数据,对其进行解析,然后通过网络发送(下面的伪代码,我的应用程序是C ++):
for line in file:
host = parse_host(line)
socket[host].send(line)
以前,我把它分成两个线程,以确保如果一个主机很慢,我们不会不必要地解析文件:
for line in file:
host = parse_host(line)
fixed_sized_queues[host].append(line)
while stillParsingFile():
sockets.poll(timeout=1s)
for queue in fixed_sized_queues:
if queue is not Empty and socket[queue.host] is ReadyForWrite:
socket[queue.host].send(q.pop())
第二个线程的逻辑非常笨重,我认为使用libevents会更好:
for line in file:
host = parse_host(line)
bufferevents[host].add(line)
我的理解是附加到bufferevent
是非阻塞的(即它将进行动态内存分配并异步将数据写入套接字)。如何通过为尚未发送的数据分配空间来防止解析线程超出网络并填满所有内存?
我目前的想法是:
evbuffer_add_reference
来减少内存使用量(仍然没有提供绑定,但至少分配应该很小)event_set_mem_functions
和自定义锁定来强制libevent
阻止并在内存达到上限时等待内存(这听起来非常危险,因为它仅在libevent
仅执行分配时才有效添加到bufferevent
而不是其他地方)evbuffer
之前抓住锁定并检查evbuffer_get_length()
;在发送线程中,在libevent