|
Publicité | |||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() Inscription : juillet 2008 Messages : 110 ![]() |
Bonjour,
J'ai une problematique de passage de données entre 2 jobs. Ces jobs travailleront toute la journée et seront chacun en Wait sur une dataqueue (1 seconde), l'arrivée d'un declencheur dans la dataqueue reveille le job B. Le job A traite une zone de 1024 caractères et renseigne une DS tableau qualified de bonne taille, a 2 dimensions dont la 2eme dimension contient plusieurs tableaux. Le job B doit recuperer cette structure ASAP, lui appliquer un traitement... Ma premiere idée est l'ecriture de cette DS dans la DataQueue du job B, qui servirait ainsi a passer les parametres et a declencher job B mais je ne suis pas convaincu par la performance qui y serait lié, or mon critère principal est la rapidité de passage des données du job A vers job B... Quelle solution envisageriez-vous ? merci. (V5R2M0) Hermelin |
|
|
00
|
|
|
#2 | ||||
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
La gestion par pointeurs et user space étant très rapide, pour éviter d'avoir à passer la DS dans la data queue, je procéderais comme suit :
Job A
Job B
Un exemple extrait de l'un de mes programmes qui gère de cette façon : Code :
Code :
Dernière modification par Mercure ; 07/02/2010 à 13h18. Motif: typo |
||||
|
|
00
|
|
|
#3 |
|
Nouveau Membre du Club
![]() Inscription : juillet 2008 Messages : 110 ![]() |
meci bcp Mercure pour avoir pris le temps de repondre et surtout documenter ta reponse. N'ayant jamais mis en oeuvre les Userspaces, j'aurais galeré sans l'exemple, je tacherais de le mettre en oeuvre dans les jours qui viennent et ferai un retour...
effectivement une zone memoire partagée me parait idéale en terme de rapidité, et l'utilisation du pointeur va m'eviter d'y copier ma DS par programmation. Tres ingénieux ! Hermelin |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Je te passerai le code complet si ça t'intéresse.
Dernière modification par Mercure ; 05/02/2010 à 00h28. |
|
|
00
|
|
|
#5 | |||
|
Nouveau Membre du Club
![]() Inscription : juillet 2008 Messages : 110 ![]() |
j'ai un petit probleme pour associer un pointeur a ma DS existante, tout le prog JobA l'utilise ainsi : Eval mot(i1).fct(i2).zona ='...' sans avoir a faire ( i1 OCCUR mot) et j'aimerais garder ce fonctionnement.
Code :
Citation:
En attendant je vais tester les API usrspc avec une DS plus simple Hermelin |
|||
|
|
00
|
|
|
#6 |
|
Nouveau Membre du Club
![]() Inscription : octobre 2008 Messages : 27 ![]() |
Bonjour,
Dans l'exemple tel que tu le donnes, p1 est dans la DS qui se base sur p1 ! Pour info, based(p1) declare lui-même p1 comme pointeur, on est pas obligé de le déclarer, après c'est une question de préférence. |
|
|
00
|
|
|
#7 | |||||
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
En effet, déclarer le pointeur "p1" est superflu. Supprimes la déclaration.
Alternativement, tu peux utiliser DIM() au lieu de OCCURS(). J'utilise OCCURS() car je fais un plus loin un FETCH groupé dans le programme, ce qui impose que la DS soit "occursée". Citation:
Voici les prototypes et les définitions des zones de travail dont tu auras besoin. Cela devrait t'aider. Code :
Pour voir le contenu du user space (ça se présente comme une data area), il faut employer le format QSYS.LIB : Code :
Dernière modification par Mercure ; 05/02/2010 à 20h36. |
|||||
|
|
00
|
|
|
#8 | |||
|
Membre habitué
![]() Inscription : août 2008 Messages : 115 ![]() |
Citation:
|
|||
|
|
00
|
|
|
#9 | |
|
Nouveau Membre du Club
![]() Inscription : juillet 2008 Messages : 110 ![]() |
Merci pour toute ces infos
Ce matin je me suis reveillé avec en tête "j'aurais pas oublié le S pour p1", véridique Toute facon je supprime cette declaration autodéclarée, je ne savais pas. ok je supprime le INZ(*zero), surtout que le usrspace est lui meme initialisé a X'00' lors de l'utilisation d'une de ses API (create je crois) A ce propos, que doit on renseigner dans us_attrib ? la doc dit : Citation:
Merci pour les prototypes Hermelin |
|
|
|
00
|
|
|
#10 | |
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Dans "extended attribute", tu mets des blancs comme je l'ai fait dans mon précédent post.
Citation:
Le gros avantage de cette méthode, c'est que dans le job B, tu n'as plus qu'à pointer le même pointeur sur la DS (/COPY) et le user space alors que data queue ou fichier imposeraient des "moves" pour alimenter la DS pour que le job puisse l'exploiter. |
|
|
|
00
|
|
|
#11 | ||
|
Nouveau Membre du Club
![]() Inscription : juillet 2008 Messages : 110 ![]() |
J'ai fini de developper mes 2 jobs de test A et B et y'a rien dire, ca fonctionne parfaitement, B retrouve tout le tableau
![]() Citation:
Derniere question : cette méthode d'echange de données inter-process est-elle compatible avec des echanges au fil de l'eau (flux) ? La doc de l'API dit que : Citation:
Hermelin |
||
|
|
00
|
|
|
#12 | ||
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Citation:
QQ points à soulever : N'oublie pas de désallouer le ou les pointeur(s) en fin de traitement dans les deux jobs/procédures. Egalement, toute mon application tourne dans le même groupe d'activation nommé, ça ne peut qu'aider. Conception et programmation ne deviennent-ils pas bien plus intéressants lorsqu'on découvre de nouvelles méthodes telles que les user spaces, les APIs et la gestion par pointeur, qui nous font sortir des sentiers battus ? Citation:
Dernière modification par Mercure ; 06/02/2010 à 22h57. |
||
|
|
00
|
|
|
#13 | |||
|
Nouveau Membre du Club
![]() Inscription : juillet 2008 Messages : 110 ![]() |
Citation:
- Dans mon cas, le user space est alimenté par A et exploité par B, et A ne doit pas re-alimenté le userspace tant que B ne l'a pas exploité. - dans ton cas tu aurais donc la garantie de l'execution de B après A (execution successive des procedures) ; donc pas de "bouchons" possible... - dans mon cas je peux imaginer une zone "flag" dans le userspace mise a jour par B et indiquant a A qu'il peut a nouveau alimenter le userspace ; mais A bouclant sur ce flag ne serait sans doute pas bon en matiere de consommation CPU. - les data queues resolvent le pb car ce sont des queues et ont cette possibilité de TIMEWAIT tres interessante bien que 1 seconde (minimum) soit un peu trop. (mais l'absence de possibilité de pointeur que tu as mis en evidence est nettement en leur defaveur) Citation:
Mais le probleme est dans ma difficulté d'adaptation et d'acquisistion, pas dans les concepts Citation:
Etant donné que chaque requete va necessiter un certain travail d'analyse, il doit etre dispatché entre plusieurs JOBs a des moments clefs de l'analyse, afin de garantir une certaine fluidité dans le traitement de la queue initiale des requetes. du Taylorisme quoi En tout cas grand merci pour ton aide, ainsi que celle des autres intervenants. Hermelin |
|||
|
|
00
|
|
|
#14 | |
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Citation:
En revanche, si tu crains que la DS soit recouverte trop tôt, tu pourrais temporiser avec en effet un flag et la fonction (API) setitimer() qui permet de suspendre ou d'arrêter l'exécution d'un programme pendant ou au bout d'un nombre spécifié de microsecondes. |
|
|
|
00
|
|
|
#15 | ||
|
Nouveau Membre du Club
![]() Inscription : juillet 2008 Messages : 110 ![]() |
Bonjour Mercure,
Citation:
Citation:
Hermelin |
||
|
|
00
|
|
|
#16 | ||
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#17 |
|
Nouveau Membre du Club
![]() Inscription : juillet 2008 Messages : 110 ![]() |
je vais tenter un "schéma" pour expliquer mon cas
Cas 2 : 1 requete ==> JobA DS dim(100) ==> DS ......... ==> DATAQUEUE ==> JOB B langage............ qualified................ mise............... FIFO naturel......................................... a plat (proc) Cas 1 : 1 requete ==> JobA DS dim(100) ==> USERSPACE ==> JOB B utilisant Ma DS langage............ qualified................................................................based(p1) naturel............. based(p1) Dans le cas 2, il me semble avoir la garantie que chaque fois que ma DS est mise a plat dans la DataQueue, JOB B pourra la relire aussitot ou demain (sauf gros crash disk) Dans le cas 1, je découvre donc peut me tromper mais si JOB A traite 100 requetes en l'absence de JOB B. Quand je lance JOB B il ne recupere alors que ma DS correspondant au 100ème traitement (?) D'ou la necessité d'une synchro dans le cas 1 Bien sur, pas de souci pour poster les resultats de mes 2 tests, dans quelques jours Hermelin |
|
|
00
|
|
|
#18 | ||
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Citation:
Citation:
Maintenant, avec l'option "data queue", tu peux journaliser la data queue pour accroître la sécurité, ce que tu ne peux pas faire avec un user space, même avec la V6R1 me semble-t-il. Cependant, le user space est un objet comme un autre qui est sauvegardable. En revanche, je pense qu'en matière de perfs, la "data queue" devrait être supplantée par l'option "user space". On verra bien le résultat lors des tests de perf. |
||
|
|
00
|
|
|
#19 | |
|
Nouveau Membre du Club
![]() Inscription : juillet 2008 Messages : 110 ![]() |
Citation:
1 requete langage naturel ==> JobA formatte la totalité des 100 postes de ma DS ==> UserSpace ==> Job B C'est 100% des occurences qui sont traitées par JobB a chaque requete Langage naturel. Hermelin, |
|
|
|
00
|
|
|
#20 |
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Dans la mesure où tu es appelé à conserver plusieurs occurrences de la DS de base, effectivement il vaut mieux utiliser l'option data queue puisque tu as besoin de quelque chose qui fasse office de job queue.
On pourrait sans doute faire aussi qqchose de propre avec les user spaces mais cela risque de demander plus de travail aussi plus complexe pour aboutir à ce que tu cherches à faire. Les data queues sont aussi plus fréquemment employées et feront moins peur que les user spaces à la future maintenance. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com