3.基本的な原則
3.1起動プロセス
1.skynet-SRC / skynet_main.cこれは、main()関数が配置されている、主に、LUA環境、デフォルトの設定について設定config設定ファイルを開き、デフォルトの設定を変更しています。でファイルをskynet_start.c最後のコールskynet_start()関数で、。
2.skynet-SRC / skynet_start.cこの文書は、港湾ノードを含むスカイネット様々なモジュールは、一部のサービスロガーのログサービスID、メッセージキューMQ、モジュールのロードDLL、クロックタイマー、ソケットとソケットの負荷を処理初期化されましたサービスは、プライマリサービス、港湾ノードサービス、snluaのLUAローディング・サービス・モジュールをマスター;そして最後に、スレッドがいくつかの_moitor、_timer、_socketスレッドが開始され、n番目の作業に応じて、スレッドの数を含む起動します。
最初の顧客サービスをロードsnlua使用
CTX = skynet_context_new(「snlua」、CONFIG->開始)。
//設定ファイルの設定にsnlua負荷CONFIG->サービスを開始し、CONFIG->スタートポイントを使用=「メイン」の行を開始します。
3.2コールサービス
これは主にC言語で実装され、コードは、この機能は、サービスダイナミックリンクライブラリをインスタンス化するために、主に「_CREATE()」および「_init()」、ならびにとしては()関数のスカイネット-SRC / skynet_server.cあるskynet_context_newプライベートメッセージキューを作成するためのサービス。そして、構造体skynet_context構造に充填します。
skynet_send()、コールバック関数とサービスを待って、キューにメッセージを送信します。
4.服务
4.1 C语言写服务
service-src/server_logger.c 简介
1、logger_create() 创建服务
2、logger_init() 初始化服务
3、logger_release() 释放服务
4、_logger() 回调函数,这个名字由skynet_callback(_logger)决定。
一个服务中的这四个函数就是Skynet 服务动态链接库的API。这里的logger_create(),其中logger表示的是logger.so的名字,Skynet的module会提取logger.so的名字作并加上”_create”来识别服务中的函数地址。函数的执行顺序是先执行”_create()”再执行”_init()”。而”_release”由skynet_context_release()调用来释放。而回调函数这是其他服务调用这个服务时会去调用它进行处理。服务的主要任务实现就在回调函数中处理。
注:回调函数简介
1.基本定义:
在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。
2.回调机制:
⑴定义一个回调函数;
⑵提供函数实现的一方在初始化时,将回调函数的函数指针注册给调用者;
⑶当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。
3.使用时机
先假设有这样一种情况:我们要编写一个库,它提供了某些排序算法的实现(如冒泡排序、快速排序、shell排序、shake排序等等),为了能让库更加通
用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,能让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。
回调可用于通知机制。例如,有时要在A程序中设置一个计时器,每到一定时间,A程序会得到相应的通知,但通知机制的实现者对A程序一无所知。那么,就需一个具有特定原型的函数指针进行回调,通知A程序事件已经发生。实际上,API使用一个回调函数SetTimer()来通知计时器。如果没有提供回调函数,它还会把一个消息发往程序的消息队列。
另一个使用回调机制的API函数是EnumWindow(),它枚举屏幕上所有的顶层窗口,每个窗口都可以通过它调用另一个程序提供的函数,并传递窗口的处理程序。例如:如果被调用者返回一个值,就继续进行迭代;否则,退出。EnumWindow()并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,它只关心返回值,因为基于返回值,它将继续执行或退出。
4.2のlua言語サービス
サービス、テスト/ testsocket.luaこのサービスでは、最も簡単な例を記述するために使用されるLuaの言語で、それは再帰反射の主な成果は、(エコー)機能、どのようなクライアントがサーバにデータを送信することは、サーバが鏡のようです同じデータがクライアントに反映されています。
サービスを開始するskynet.start()
分析の例: