Cours Lua Tâche 1.6 Manuel en pdf


Télécharger Cours Lua Tâche 1.6 Manuel en pdf

★★★★★★★★★★3.5 étoiles sur 5 basé sur 1 votes.
Votez ce document:

Télécharger aussi :


introduction Qui doit lire ceci Le public cible est le programmeur souhaitant disposer de plusieurs univers Lua, chacun exécutant un thread indépendant du système d'exploitation. Le nom Nous choisissons le nom de "tâche" pour éviter toute confusion avec les "threads lua". L'idée Imaginez un système de recherche de base de données, en attente de demandes de clients avec différents mécanismes de communication: Netbios, TCP / IP et Websphere MQ: Nous supposerons que le serveur de base de données surpasse nos besoins. Nous pouvons maintenant identifier au moins quatre fonctions spécifiques dans le système: 1. Communications Netbios. 2. Communications TCP / IP. 3. Communications MQ. 4. Recherche et récupération. Laissez-moi redessiner la figure précédente: Avec une charge modérée, notre système peut effectuer les fonctions 1 à 4 de manière séquentielle. Mais lorsque le nombre de clients augmente, nous devons essayer de superposer des fonctions non liées afin d’accélérer l’ensemble du système. LuaTask vous aide à accomplir cela en utilisant plusieurs threads d'exécution. Faire face à une lourde charge ... ajoute une certaine complexité et, probablement, une nouvelle tâche: 5. Le répartiteur. Les tâches 1 à 5 s'exécutent indépendamment et se communiquent via des files de messages. En utilisant LuaTask, il est possible d’enchaîner les événements suivants: 1. Une tâche de communication reçoit un message d'un client. 2. Il transmet le message au répartiteur. 3. Le répartiteur choisit une tâche de recherche et place le message dans sa file d'attente. 4. La tâche de recherche fait son travail et envoie la réponse directement à la tâche de communication. 5. La tâche de communication envoie la réponse au client. Chaque tâche a une file de messages, implémentée en tant que liste chaînée de fifo en mémoire. Chaque entrée d'une file d'attente de messages a une zone de données allouée dynamiquement et un numéro général à 32 bits. Tout cela peut être facilement programmé dans Lua, LuaTask et dans des bibliothèques telles que LuaSocket, LuaSQL, etc. Bâtiment Étape 1 Développez le répertoire src à partir de tgz dans le répertoire src de votre installation Lua. Étape 2 Win32 Vous devez sélectionner le support de threading: 1. Définissez NATV_WIN32: code d'origine sans annulation. 2. ne pas définir NATV_WIN32: Pthreads? Win32 dépend du code. (Vous devez avoir Pthreads? Win32 INSTANTANÉ 2004? 06? 22 ou plus tard) Statique Adaptez votre utilisation à titre d'exemple. Construire Module chargeable Mettez dans src / LuaTask de votre installation. Ajoutez-le à Construire Linux / BSD Statique Adaptez votre configuration en utilisant build / ix / static / config à titre d'exemple. Adaptez votre src / lib / Makefile en utilisant build / ix / static / Makefile comme exemple. Construire Lua binary. Module chargeable Adaptez votre configuration en utilisant build / ix / module / config à titre d'exemple. Placez build / ix / module / Makefile dans src / LuaTask de votre installation. Construire La programmation Comment l'utiliser Si vous lie statiquement LuaTask, vous devez appeler luaopen_task () après avoir appelé lua_open () dans votre programme. C'est la seule chose à coder en langage C. Si vous utilisez la bibliothèque dynamique LuaTask, vous devez inclure le code suivant dans la tâche principale: demande obligatoire Le code d’initialisation dans LuaTask crée la liste de tâches globale, obtient une clé spécifique au thread et crée la "tâche" espace de noms. Maintenant, vous pouvez utiliser les fonctions de l'espace de noms "task" pour manipuler des tâches et des messages. Consultez le "Guide de référence LuaTask" pour connaître la syntaxe des fonctions. Un exemple très simple avec deux tâches 1. Une tâche principale affichant une invite et obtenant une commande. 2. Une tâche d'écho secondaire. La tâche principale (): nécessite 'tâche' local myid = () >> obtient la tâche actuelle idlocal tsk, err = task.create ('', {myid}) >> crée une nouvelle tâche en attendant vrai io.stdout: write ('\ necho>') >> montre invite cmd local = ('* l') >> obtient le commandement si cmd == 'quitter' alors Pause >> si la commande est quittée, se termine autre (tsk, cmd, 0) >> envoie le texte de la commande à la tâche d'écho buf local, drapeaux, rc = task.receive (? 1) >> attend la réponse io.stdout: write (buf) >> montre la réponse endend (tsk, '', 1) >> envoie un message factice avec "1" comme arrêt flagtask.receive (1000) >> attend (1 sec) pour arrêter l'accusé de réception de la tâche d'écho La tâche "echo" (): local main_id = arg [1] >> obtient l'identifiant de la tâche principale de arg [1] alors que true fait buf local, drapeaux, rc = task.receive (? 1) >> attend le message si drapeaux == 1 alors Pause>> si flags est arrêté, se termine autre (main_id, 'Echo: {' .. buf .. '}', 0) >> envoie l'écho endend (main_id, '', 1) >> envoie un accusé de réception pour le message d'arrêt Exemple de système de recherche de base de données 1. Une tâche principale répartissant les demandes des tâches d’entrée en tâches de travail. 2. Une tâche de saisie Netbios. 3. Une tâche d'entrée TCP / IP. 4. Une tâche d'entrée MQ. 5. Cinq tâches de travail SQL. Le Dispatcher (): require'task '>> définit le nombre de travailleurs locaux = 5 >> enregistre la tâche idlocal me = () >> crée l'id de la tâche des travailleurs tablelocal WTable = {} >> commence les travailleurs pour w = 1, les travailleurs font WTable [1] = task.create ('', {me}) end >> démarre l'entrée tâchestask.create ('', {me}) task.create ('', {me})} task.create ('', {me}) local w = 0 alors que true le fait >> reçoit la demande demande locale, drapeaux, err = task.receive (? 1) >> fait un simple tour? robin dispatching si w == travailleurs alors w = 1 autre w = w + 1 fin >> transmet la demande au travailleur sélectionné (WTable [w], demande, indicateurs) fin La tâche d’entrée Nébios (): >> L’interface de Netbios a été beaucoup simplifiée >> Le démarrage et l'arrêt de la session sont masqués. >> Désolé, nous allons utiliser le sondage pour plus de simplicité >> Ajoute un nom Netbios NB_AddName ('MyNetbiosName') >> enregistre la tâche dispatcher idlocal dispatcher = arg [1] >> enregistre la tâche idlocal me = () alors que true le fait >> Reçoit avec timeout demande locale, lsn, err = NB_ListenAndReceive (100) sinon errer alors >> envoie la demande s'il n'y a pas d'erreur >> flags contient cet identifiant de tâche et l'origine lsn du >> message (8 bits) décalé de 4 bits (dispatcher, request, me + lsn * 16) fin réponse locale, drapeaux, err = task.receive (100) si réponse alors >> envoie une réponse err = NB_Send (math.floor (flags / 16), response) La tâche d'entrée TCP / IP (): >> L’interface Tcp a été beaucoup simplifiée>> Le démarrage et l'arrêt de la session sont masqués. >> Désolé, nous allons utiliser le sondage pour plus de simplicité >> Crée un serveur socketlocal svrskt = CreateServerSocket ('*', 12321) >> enregistre la tâche dispatcher idlocal dispatcher = arg [1] >> enregistre la tâche idlocal me = () alors que true le fait >> Reçoit avec timeout demande locale, cidx, err = AcceptAndReceive (svrskt, 100) sinon errer alors >> envoie la demande s'il n'y a pas d'erreur >> flags contient cet identifiant de tâche et l'index de socket >> origine du message (16 bits) décalée de 4 bits (dispatcher, request, me + cidx * 16) fin réponse locale, drapeaux, err = task.receive (100) si réponse alors >> envoie une réponse err = SendAndClose (math.floor (flags / 16), response) La tâche d'entrée MQ (): >> L'interface MQ a été beaucoup simplifiée >> Désolé, nous allons utiliser le sondage pour plus de simplicité >> Se connecte au gestionnaire de files d'attente qmhandle, compcode, raison = MQCONN ('MyQMName') >> enregistre la tâche dispatcher idlocal dispatcher = arg [1] >> enregistre la tâche idlocal me = () alors que true le fait >> Reçoit avec timeout demande locale, msgobjidx, err = MQ_GetWithTimeout (100) sinon errer alors >> envoie la demande s'il n'y a pas d'erreur >> flags contient cet identifiant de tâche et l'objet message >> origine de l'index du message (24 bits) >> décalé de 4 bits à gauche (dispatcher, request, me + msgobjidx * 16)





59