【问题标题】:How to implement multithreading in Libsoup server?如何在 Libsoup 服务器中实现多线程?
【发布时间】:2015-06-29 06:16:20
【问题描述】:

我想在 Libsoup 服务器中实现多线程,这样每次客户端请求到来时,都会创建一个新线程来服务该请求。 如何使用 Libsoup 和 GLib 库来实现这一点?

我目前的服务器主代码是这样的:

sending_file =  fopen("abc/project_foo.zip", "r");
fseek(sending_file, 0L, SEEK_END);
size_of_file = ftell(sending_file);
fseek(sending_file, 0L, SEEK_SET);
int port = 15000;

server = soup_server_new(SOUP_SERVER_RAW_PATHS,TRUE,SOUP_SERVER_PORT,port, SOUP_SERVER_SERVER_HEADER,"simple-httpd",NULL);


soup_server_add_handler(server , "/foo" , server_callback, NULL , NULL);
soup_server_run_async (server);

printf("Waiting for Requests...\n");

//Running a main loop so Async will work
GMainLoop *loop;
loop = g_main_loop_new (NULL, TRUE);
g_main_loop_run (loop);
return 0;

【问题讨论】:

  • 请分享您迄今为止尝试过的任何方法。
  • 我已经添加了我的主要功能代码

标签: c multithreading glib gnome


【解决方案1】:

在您传递给soup_server_add_handler 的回调中创建一个新线程。 manual explains the rest;相关部分:

默认情况下,当您从回调返回时,libsoup 假定您已完全处理完消息,因此它可以开始发送响应。如果您还没有准备好立即发送响应(例如,您必须联系另一台服务器,或等待来自数据库的数据),您必须在从回调返回之前对消息调用soup_server_pause_message。这将延迟发送响应,直到您致电 soup_server_unpause_message。 (在这种情况下,您还必须连接到消息上的finished 信号,以便在您开始发送数据之前,如果客户端意外断开连接,您可以中断处理。)

所以请确保您在传递给soup_server_add_handler 的回调中调用soup_server_pause_message,然后当您处理完线程调用soup_server_unpause_message 中的请求时。

您可能想考虑使用thread pool,而不是为每个请求创建一个新线程,但想法几乎相同——只需向池中添加一个任务而不是创建一个新线程。

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2014-02-19
    • 1970-01-01
    相关资源
    最近更新 更多