help in pexpect multiprocessing

Pablo Lucena plucena24 at gmail.com
Tue Nov 10 07:42:02 EST 2015


I think the problem is that you cannot pass around an open socket via
pickle. Whats the error message you are getting?

Try adding the session establishment code to the stop function, so that
each new process opens a session to the server and executes the command.

def stop(ds):
        s = pxssh.pxssh()
​    ​
s.login ('host','username','password')
        s.sendline ('ps -ef|grep java')
        s.prompt(timeout=1)
        s.sendline ('cd /usr')
        if condition:
                lock = threading.Lock()
                lock.acquire()
                s.expect('Enter username:')
                s.sendline ('user')
                s.expect('Enter password:*')
                s.sendline('pass')
                lock.release()
        s.prompt(timeout=200)
        print('stopped ds...')


if condition == 'met':
       np = len(list1)
       p = multiprocessing.Pool(np)
       p.map(stop, [(ds) for ds in list1])

On Mon, Nov 9, 2015 at 7:37 AM, <harirammanohar159 at gmail.com> wrote:

> Hi,
>
> I am using multiprocessing with pexpect, issue is whenever i call a
> function which is having expect(), its throwing error which is genuine as
> multiple threads are processing it same time (i/o prompt same time by
> multiple processes..so issues in picture...), so i want to use lock for
> that section alone to avoid it, but still fails in implementing it...can
> you help me
>
> username = input('Enter your username: ')
> password = getpass.getpass()
>
> s = pxssh.pxssh()
> s.login ('host','username','password')
> s.sendline ('ps -ef|grep java')
> s.prompt(timeout=1)
>
> Try 1:
>
> if condition == 'met':
>        np = len(list1)
>        p = multiprocessing.Pool(np)
>        p.map(stop, [(ds) for ds in list1])
>
> def stop(ds):
>         s.sendline ('cd /usr')
>         if condition:
>                 lock = threading.Lock()
>                 lock.acquire()
>                 s.expect('Enter username:')
>                 s.sendline ('user')
>                 s.expect('Enter password:*')
>                 s.sendline('pass')
>                 lock.release()
>         s.prompt(timeout=200)
>         print('stopped ds...')
>
> Try 2:
>
> if condition == 'met':
>         lock = Lock()
>         for ds in list1:
>                 Process(target=stop, args=(ds,lock)).start()
>
> def stop(ds,l):
>         s.sendline ('cd /usr')
>         if condition:
>                 l.acquire()
>                 s.expect('Enter username:')
>                 s.sendline ('user')
>                 s.expect('Enter password:*')
>                 s.sendline('pass')
>                 l.release()
>         s.prompt(timeout=200)
>         print('stopped ds...')
>
> Both are giving me same trace..
>
> pexpect.ExceptionPexpect: isalive() encountered condition where
> "terminated" is 0, but there was no child process. Did someone else call
> waitpid() on our process?
>
> Thanks in Advance
> --
> https://mail.python.org/mailman/listinfo/python-list
>



-- 
*Pablo Lucena*



More information about the Python-list mailing list