On Sat, 2008-12-13 at 13:02 +0500, Supun Kamburugamuva wrote:
> Hi all,
> 
> This question has being popping up time to time. First we need to
> think why we need to execute Axis2/C clients in multiple threads
> instead of using separate clients in different threads. One advantage
> of using a single client is the overhead associated with multiple
> clients. A single axis2_svc_client requires multiple axis2
> configurations and multiple environments. This is the only reasong
> comes to my mind right now for not using different axis2_svc_clients
> in different threads. If you have any other requirements please share
> with us.
> 
> If performance is the concern associated with creating multiple
> clients, there is a solution to the problem. The real entity that do
> the most important work in the client side is axis2_mep_client.

Not mep_client it is op_client.

>  axis2_svc_client is a wrapper around the mep client for make the job
> easier for the client programmer. But axis2_svc_client is not designed
> for a multithreaded environment. The problems with axis2_svc_client
> running in multiple threads is it keep tracks of the various objects
> from previous invokations. This leads to double free this resources in
> multiple threading environments.
> 
> But if we can use the mep client these problems won't be there. The
> only problem with mep client is it requires quite a bit of coding to
> make it work. If we can provide a simple thread safe method set for
> directly accessing the mep client it will be really useful. So devs
> what do you think?

Actually AFAIK, even each svc_client_send_receive creates a new
op_client and this op_client uses the configurations created from
svc_client. So svc_client is like a container which keeps the
configurations for the use of op_clients. What we need to do is we
should provide methods to application clients to create configurations
of their own. So they can pass these to op_client and do the work. 

> 
> Supun.. 
> 
> On Thu, Dec 11, 2008 at 10:37 PM, Bill Mitchell
> <bmitch...@austin.rr.com> wrote:
>         Patrick, when building a multi-threaded Axis2C client I too
>         was
>         concerned about the multiple environments.  Although your
>         statement is correct in a sense that each thread needs its own
>         environment/stub, these environments can in fact share much of
>         the underlying structures.  In practice, each thread needs its
>         own error stack, but it can certainly share the allocator and
>         logger.  And the configuration information is associated with
>         the allocator.  There is a primitive function
>         axutil_env_create_with_error_log_thread_pool() that lets you
>         share the substructures already created for the "global"
>         environment
>         created once for the application.  This way the configuration
>         information is read only once.  Axutil_env_free_masked() lets
>         each thread free just its error stack upon termination,
>         leaving
>         the allocator et.al. intact.
>         
>         I was not dealing with asynchronous operation in my
>         application,
>         so I don't know if you might need a separate thread-pool for
>         each created environment.
>         
>         Good luck,
>         Bill Mitchell
>         
>         
>         -----Original Message-----
>         From: Lefrancois, Carl [mailto:carl.lefranc...@axa-canada.com]
>         Sent: Thursday, December 11, 2008 9:56 AM
>         To: Apache AXIS C Developers List
>         Subject: RE : Multi-threading
>         
>         Hello Patrick,
>         
>         Manjula kindly provided a best-practice example for how to do
>         multi-threading with Axis2/C [1] (at least on the client
>         side)  if I
>         remember correctly, it was one environment per thread, and the
>         stubs
>         were per call?  Well in his example it is svc_client and not
>         stub, but
>         if I understand correctly, those two concepts are one-to-one,
>         meaning
>         one stub has one svc_client.
>         
>         >From my point of view it seems the troubles you are
>         encountering are
>         based in areas where Axis does little or nothing to help the
>         programmer.
>         I have not seen any code to manage thread creation and
>         resources acces
>         in the Axis2/C project.  Problems like resource deadlock on
>         the
>         configuration file are outside the scope of what Axis2/C has
>         to offer.
>         
>         What Axis does well is freeing resources (once we figure out
>         how to set
>         everything up right!) so I am a little confused as to where
>         exactly the
>         limitations are.  You say the callback system provided is not
>         good in
>         terms of freeing resources, but have you tried freeing your
>         resources
>         from another function which itself waits for the callback to
>         occur?
>         (either error callback or success callback)  I think this is
>         the way
>         Axis was designed with as implied by Dimuthu: wait in a loop
>         in your
>         main thread while the callbacks are outstanding, do no cleanup
>         in the
>         callback itself, let that thread exit completely and after it
>         is done,
>         then from your main thread detect that the callback ocurred
>         and do the
>         cleanup there.
>         
>         For environment vs stub issues, there is no alternative but to
>         take
>         ownership of this problem directly and implement some
>         synchronisation
>         outside the scope of Axis2/C.  Your code synchronises creation
>         of
>         threads and initialisation to avoid having deadlock problems.
>          Maybe
>         there is some improvement to be made to Axis here?
>         
>         My reason for responding though is really to comment on this
>         phrase:
>         "Threads are a rather expensive resource to use for just
>         waiting on an
>         IO completion".  It may be my lack of understanding, but I am
>         pretty
>         sure that -- at least in the win32 tcp/ip stack -- once your
>         thread goes
>         into asynchronous communication on a socket, you do not see it
>         again
>         until there is some result.  This means if there is a timeout
>         your
>         thread is inactive for a long time.  How can one thread wait
>         on more
>         than one asychronous communication?  I admit this would be a
>         far better
>         solution, however from my understanding of winsock2 it is not
>         possible.
>         
>         Seen this way, one thread per socket communication is maybe
>         expensive in
>         resources, but it is the only way to ensure your main thread
>         continues
>         to operate in a timely fashion.
>         
>         Hth
>         
>         Carl
>         
>         
>         [1]
>         http://marc.info/?l=axis-c-user&amp;m=118404667311058&amp;w=2
>         
>         
>         
>         
>         
>         -----Message d'origine-----
>         De : Patrick van Beem [mailto:patrick.van.b...@quintiq.com]
>         Envoyé : jeudi, décembre 11, 2008 05:46
>         À : axis-c-dev@ws.apache.org
>         Objet : Multi-threading
>         
>         
>         Hello,
>         
>         I'm experiencing serious limitations while using axis in a
>         multi-threading environment. I know axis is not fully designed
>         (yet?)
>         for multi-threading, but I think some 'small' changes might
>         make it more
>         usable. One can't deny multi-threading. Here my 2 cents:
>         
>         
>         * Callback and resources
>         In a multi-threading environment, an asynchronous job is often
>         responsible for freeing it's own resources (in this case, the
>         environment, the stub and possible extra application dependent
>         data). In
>         the axis framework, this can't be done in the callback, since
>         the
>         framework will use the stub after the callback is finished.
>         This makes
>         it impossible for an application to free resources after a
>         call has
>         finished (because you never know exactly when the call
>         (including the
>         framework part of it) is finished. This makes the asynchronous
>         implementation of axis useless in a job-oriented
>         multi-threading
>         environment. Improvements might include adding an extra
>         callback to free
>         resources, that is made when axis has freed all its resources
>         and does
>         not need any resources the user might free.
>         
>         
>         * Environment vs stub
>         Since every thread needs it's own environment and stub in axis
>         and (as
>         stated above) in a multi-threaded environment a job is often
>         responsible
>         of it's own resources, every job needs to allocate and
>         initialize it's
>         environment and stub for each call (or keep one set
>         initialized for
>         every thread, but that's not feasible when one thread can be
>         used for
>         multiple purposes / jobs and/or threads can be added
>         dynamically). And
>         free it after the job is finished. Apart from the (slight)
>         performance
>         drawback, this poses another problem: Part of the stub
>         initialization
>         includes reading the configuration file. When two threads try
>         to do this
>         simultaneously, the last one who tries this, fails. Solutions
>         to this
>         problem might include:
>         - Create a clone function for the stub, so all threads can
>         clone from
>         template stub, instead of reading from disk.
>         - Separate the state information from the stub and put it in
>         the
>         environment, so the stub can be used read-only and shared by
>         threads.
>         
>         
>         * Async model
>         The asynchronous call implementation of axis is based on
>         creating new
>         threads that just wait on a response. Threads are a rather
>         expensive
>         resource to use for just waiting on an IO completion (and then
>         performing some small task). It might be better that the
>         waiting on all
>         outstanding IO is done by one single thread. The work after
>         the IO
>         completed can then be done by either that thread, or a (small
>         and
>         static) thread pool. That way, no threads have to be created /
>         deleted
>         on the flow, not more than one thread is waiting on IO and no
>         high
>         amount of threads will exist when a lot of asynchronous calls
>         exist in
>         parallel. My axis knowledge is not enough to see solutions for
>         this
>         within axis right now.
>         
>         
>         What do you all think about these points?
>         
>         Regards,
>         
>         --
>         
>         
>         Patrick van Beem
>         Sr. Software engineer
>         
>         Quintiq
>         
>         T +31 (0) 73 691 07 39
>         F +31 (0) 73 691 07 54
>         M +31 (0) 06 15 01 65 83
>         E patrick.van.b...@quintiq.com
>         I www.quintiq.com
>         
>         
>         
>         This message contains information that may be privileged or
>         confidential
>         and is the property of Quintiq. It is only intended for the
>         person to
>         whom it is addressed. If you are not the intended recipient,
>         you are not
>         authorized to read, print, retain, copy, disseminate,
>         distribute or use
>         this message or any part thereof. If you have received this
>         message in
>         error, please notify the sender immediately and delete all
>         copies of
>         this message. Please note that e-mails are susceptible to
>         change,
>         therefore they are not binding.
>          _____
>         
>         "Ce message est confidentiel, à l'usage exclusif du
>         destinataire
>         ci-dessus et son contenu ne représente en aucun cas un
>         engagement de la
>         part de AXA, sauf en cas de stipulation expresse et par écrit
>         de la part
>         de AXA. Toute publication, utilisation ou diffusion, même
>         partielle,
>         doit être autorisée préalablement. Si vous n'êtes pas
>         destinataire de ce
>         message, merci d'en avertir immédiatement l'expéditeur."
>         
>         "This e-mail message is confidential, for the exclusive use of
>         the
>         addressee and its contents shall not constitute a commitment
>         by AXA,
>         except as otherwise specifically provided in writing by AXA.
>         Any
>         unauthorized disclosure, use or dissemination, either whole or
>         partial,
>         is prohibited. If you are not the intended recipient of the
>         message,
>         please notify the sender immediately."
>         
>         
>         
> 
> 
> 
> -- 
> Software Engineer, WSO2 Inc
> http://wso2.org
> Web Services with Axis2/C http://wsaxc.blospot.com
> 

Reply via email to