我可以在libevent中限制bufferevents的内存使用吗?

时间:2015-06-25 16:38:57

标签: c++ c multithreading memory libevent

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
  • 的低水位写回调中发出解析线程的信号

0 个答案:

没有答案