Path: csiph.com!usenet.pasdenom.info!weretis.net!feeder4.news.weretis.net!ecngs!feeder2.ecngs.de!newsfeed.freenet.ag!news2.euro.net!newsgate.cistron.nl!newsgate.news.xs4all.nl!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.004 X-Spam-Evidence: '*H*': 0.99; '*S*': 0.00; '__name__': 0.07; 'main()': 0.07; 'suppose': 0.07; 'python': 0.09; 'subject:process': 0.09; 'subject:skip:m 10': 0.09; 'subject:while': 0.09; 'underlying': 0.09; 'cc:addr:python-list': 0.10; 'looked': 0.10; 'def': 0.10; 'library': 0.15; "'__main__':": 0.16; 'descriptors': 0.16; 'hangs': 0.16; 'least,': 0.16; 'main():': 0.16; 'subject:run': 0.16; 'wrote:': 0.17; 'code,': 0.18; 'sender:addr:gmail.com': 0.18; 'app': 0.19; 'bit': 0.21; 'import': 0.21; 'cc:2**0': 0.23; 'work.': 0.23; 'cc:no real name:2**0': 0.24; 'cc:addr:python.org': 0.25; 'header:In-Reply-To:1': 0.25; 'am,': 0.27; 'first,': 0.27; 'skip:# 10': 0.27; 'message-id:@mail.gmail.com': 0.27; 'received:209.85.212': 0.28; 'app.': 0.29; 'queue': 0.29; 'fri,': 0.30; 'implement': 0.32; 'file': 0.32; 'running': 0.32; 'could': 0.32; 'print': 0.32; 'builds': 0.33; 'handle': 0.33; "can't": 0.34; 'skip:b 20': 0.34; 'received:google.com': 0.34; 'done': 0.34; 'especially': 0.35; 'received:209.85': 0.35; 'there': 0.35; 'but': 0.36; 'child': 0.36; 'subject: (': 0.36; 'turn': 0.36; 'possible': 0.37; 'correctly': 0.37; 'does': 0.37; 'two': 0.37; 'being': 0.37; 'received:209': 0.37; 'subject:: ': 0.38; 'things': 0.38; 'sure': 0.38; 'build': 0.39; 'little': 0.39; 'header:Received:5': 0.40; 'days': 0.60; 'john': 0.60; 'close': 0.63; 'more': 0.63; 'here': 0.65; '20,': 0.65; 'alive.': 0.65; 'jul': 0.65; 'believe': 0.69; 'compiles': 0.84; 'doable': 0.84; 'running,': 0.84; 'subject:Let': 0.91 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date :x-google-sender-auth:message-id:subject:to:cc:content-type; bh=KOomyX5HhvWZJZ/H2kf5auxKzvHTEvXxi+5hfz3dNPE=; b=a+pAD+G7DXwIUldG357gGK2P4drDP5Siw6hwwavLW+gtgm/8B8pi4malaNjq2/OVyp Lvz5XzNN++TFzopnYbSpGF65HuN/od7skn9NF2TTby1a9ZsQGnYTx4ZfuNzYWLMJN7c4 NbFgIigU0G9fa0o1OATcIrKcg6NVHa6qx4gKH6z+NH29uRjiJ0sW+LrJmX9faxJcfrXv wvNziox/2hkTVRaVfvuv3Ae5T+ointIVVRDuhlEufV9fUsbbQhhqZb1tOsRhvtkxL3R2 LRnL1xsE7Gx0o/gEeJNywpM0VnM8ZWLm8FoqAK9SD9RcPjLdt2UWPGCafwiXyG5sQbJZ jmfg== MIME-Version: 1.0 Sender: kushal.kumaran@gmail.com In-Reply-To: References: From: Kushal Kumaran Date: Fri, 20 Jul 2012 14:18:51 +0530 X-Google-Sender-Auth: _WtTmKLW7W3hEcngDfCRHHFKjrs Subject: Re: Let child process to run while parent is out (multiprocessing) To: John Wong Content-Type: text/plain; charset=UTF-8 Cc: python-list@python.org X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 84 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1342774158 news.xs4all.nl 6844 [2001:888:2000:d::a6]:49855 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:25684 On Fri, Jul 20, 2012 at 2:04 AM, John Wong wrote: > def main(...): > build_id = create_build_id(...) > build_stuff > return build_id > > Suppose build_stuff compiles a C program. It could take days to finish, and > notify users their builds are ready. I was thinking about using > mutliprocessing to handle the build_stuff. > > So here is a sample: > > #!/usr/bin/python > > import multiprocessing as mp > import time > > def build(): > print 'I am building HUGE things' > time.sleep(10) > > def main(): > build_p = mp.Process(name='build process', target=build) > build_p.start() > return 'abcd12345' > > if __name__ == '__main__': > > v = main() > print v > print 'done' > > Here is output: > yeukhon@fermat:~$ python c2.py > abcd12345 > done [now hangs for 10 seconds] > I build things > > When I looked at `ps -elf|grep python`, I can see two processes running, and > one of the python c2.py process is `wait`. But this is not ideal, > especially this is a web app. I can't implement any advanced queue / event > system right now (I use Pylon, I believe I have gevent installed). But just > with multiprocessing, is it possible to send the id first, while running > child in the backgroud? > > Right now it hangs there as long as the child process is alive. Any > solutions? > >From the documentation, there does not seem to be any way of "detaching" a multiprocessing Process. But it is doable by using the underlying os.fork directly (CAUTION: not ready for being invoked from a web app): #!/usr/bin/python import os import time def build_and_send_email(): print 'I am building HUGE things' time.sleep(10) def main(): child_pid = os.fork() if child_pid == 0: build_and_send_email() os._exit(0) return 'abcd12345' if __name__ == '__main__': v = main() print v print 'done' To make it work correctly with web app will require a bit more work. At the least, you will have to close all file descriptors to make sure the request processing finishes. You can turn it into a proper background process (a daemon) using the python-daemon library with very little code, I think. -- regards, kushal