data_completion_t
、などのコールバック署名が見つかりましstring_completion_t
た。しかし、飼育係が非同期 API でこれらの関数をどのように呼び出すのか疑問に思います。
Zookeeper からの応答を受信するために単一のスレッドを使用しますか? したがって、コールバックで保護するためにミューテックスを追加する必要user_data
があります。それとも、別の非同期 API が呼び出されるたびにコールバックをチェックしますか?
data_completion_t
、などのコールバック署名が見つかりましstring_completion_t
た。しかし、飼育係が非同期 API でこれらの関数をどのように呼び出すのか疑問に思います。
Zookeeper からの応答を受信するために単一のスレッドを使用しますか? したがって、コールバックで保護するためにミューテックスを追加する必要user_data
があります。それとも、別の非同期 API が呼び出されるたびにコールバックをチェックしますか?
C mt ライブラリをテストしたところ、zookeeper が IO と完了用に別の 2 つのスレッドを作成したことがわかりました。完了関数は完了スレッドで呼び出されるため、これらの関数は順番に呼び出される必要があります。
2012-10-09 15:35:36,904:60028(0x7fff7d0f7180):ZOO_INFO@zookeeper_init@786: Initiating client connection, host=127.0.0.1:3000 sessionTimeout=5000 watcher=0x0 sessionId=0 sessionPasswd=<null> context=0x0 flags=0
2012-10-09 15:35:36,904:60028(0x7fff7d0f7180):ZOO_DEBUG@start_threads@221: starting threads...
2012-10-09 15:35:36,905:60028(0x10af45000):ZOO_DEBUG@do_completion@459: started completion thread
2012-10-09 15:35:36,905:60028(0x10aec2000):ZOO_DEBUG@do_io@367: started IO thread
2012-10-09 15:35:36,905:60028(0x7fff7d0f7180):ZOO_DEBUG@zoo_aset@2700: Sending request xid=0x5073d3c9 for path [/mm/mmidc] to 127.0.0.1:3000
2012-10-09 15:35:36,905:60028(0x10aec2000):ZOO_INFO@check_events@1703: initiated connection to server [127.0.0.1:3000]
2012-10-09 15:35:36,909:60028(0x10aec2000):ZOO_INFO@check_events@1750: session establishment complete on server [127.0.0.1:3000], sessionId=0x13a43632d85000f, negotiated timeout=5000
2012-10-09 15:35:36,909:60028(0x10aec2000):ZOO_DEBUG@check_events@1756: Calling a watcher for a ZOO_SESSION_EVENT and the state=ZOO_CONNECTED_STATE
2012-10-09 15:35:36,909:60028(0x10af45000):ZOO_DEBUG@process_completions@2107: Calling a watcher for node [], type = -1 event=ZOO_SESSION_EVENT
2012-10-09 15:35:36,910:60028(0x10aec2000):ZOO_DEBUG@process_sync_completion@1868: Processing sync_completion with type=1 xid=0x5073d3c9 rc=-101
zoo_set2: no node
テスト用の非常に単純なコード。飼育係サーバーは、localhost:3000 をリッスンするスタンドアロンです。
int main()
{
zoo_set_debug_level(ZOO_LOG_LEVEL_DEBUG);
const char* host = "127.0.0.1:3000";
zhandle_t *zh;
clientid_t myid;
zh = zookeeper_init(host, NULL, 5000, &myid, NULL, 0);
struct Stat stat;
const char* line = "/test";
const char* ptr = "hello, world";
int ret = zoo_set2(zh, line, ptr, strlen(ptr), -1, &stat);
printf("zoo_set2: %s\n", zerror(ret));
}
実際、これらはドキュメントで説明されています。http://zookeeper.apache.org/doc/r3.1.2/zookeeperProgrammers.html
Cバインディング
The C binding has a single-threaded and multi-threaded library. The multi-threaded library is easiest to use and is most similar to the Java API. This library will create an IO thread and an event dispatch thread for handling connection maintenance and callbacks. The single-threaded library allows ZooKeeper to be used in event driven applications by exposing the event loop used in the multi-threaded library.