Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6682895
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 26, 20262026-05-26T04:45:31+00:00 2026-05-26T04:45:31+00:00

My understanding is that finally clauses must *always* be executed if the try has

  • 0

My understanding is that finally clauses must *always* be executed if the try has been entered.

import random

from multiprocessing import Pool
from time import sleep

def Process(x):
  try:
    print x
    sleep(random.random())
    raise Exception('Exception: ' + x)
  finally:
    print 'Finally: ' + x

Pool(3).map(Process, ['1','2','3'])

Expected output is that for each of x which is printed on its own by line 8, there must be an occurrence of ‘Finally x’.

Example output:

$ python bug.py 
1
2
3
Finally: 2
Traceback (most recent call last):
  File "bug.py", line 14, in <module>
    Pool(3).map(Process, ['1','2','3'])
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 225, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 522, in get
    raise self._value
Exception: Exception: 2

It seems that an exception terminating one process terminates the parent and sibling processes, even though there is further work required to be done in other processes.

Why am I wrong? Why is this correct? If this is correct, how should one safely clean up resources in multiprocess Python?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-26T04:45:32+00:00Added an answer on May 26, 2026 at 4:45 am

    Short answer: SIGTERM trumps finally.

    Long answer: Turn on logging with mp.log_to_stderr():

    import random
    import multiprocessing as mp
    import time
    import logging
    
    logger=mp.log_to_stderr(logging.DEBUG)
    
    def Process(x):
        try:
            logger.info(x)
            time.sleep(random.random())
            raise Exception('Exception: ' + x)
        finally:
            logger.info('Finally: ' + x)
    
    result=mp.Pool(3).map(Process, ['1','2','3'])
    

    The logging output includes:

    [DEBUG/MainProcess] terminating workers
    

    Which corresponds to this code in multiprocessing.pool._terminate_pool:

        if pool and hasattr(pool[0], 'terminate'):
            debug('terminating workers')
            for p in pool:
                p.terminate()
    

    Each p in pool is a multiprocessing.Process, and calling terminate (at least on non-Windows machines) calls SIGTERM:

    from multiprocessing/forking.py:

    class Popen(object)
        def terminate(self):
            ...
                try:
                    os.kill(self.pid, signal.SIGTERM)
                except OSError, e:
                    if self.wait(timeout=0.1) is None:
                        raise
    

    So it comes down to what happens when a Python process in a try suite is sent a SIGTERM.

    Consider the following example (test.py):

    import time    
    def worker():
        try:
            time.sleep(100)        
        finally:
            print('enter finally')
            time.sleep(2) 
            print('exit finally')    
    worker()
    

    If you run it, then send it a SIGTERM, then the process ends immediately, without entering the finally suite, as evidenced by no output, and no delay.

    In one terminal:

    % test.py
    

    In second terminal:

    % pkill -TERM -f "test.py"
    

    Result in first terminal:

    Terminated
    

    Compare that with what happens when the process is sent a SIGINT (C-c):

    In second terminal:

    % pkill -INT -f "test.py"
    

    Result in first terminal:

    enter finally
    exit finally
    Traceback (most recent call last):
      File "/home/unutbu/pybin/test.py", line 14, in <module>
        worker()
      File "/home/unutbu/pybin/test.py", line 8, in worker
        time.sleep(100)        
    KeyboardInterrupt
    

    Conclusion: SIGTERM trumps finally.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

so I'm finally understanding prototype and how to use it. I'm sure that I'm
We have a windows service that has been happily running in production for over
Understanding that I should probably just dig into the source to come up with
It's my understanding that nulls are not indexable in DB2, so assuming we have
It's my understanding that common wisdom says to only use exceptions for truly exceptional
It is my understanding that I can test that a method call will occur
It is to my understanding that one should use a forward-class declaration in the
It is my understanding that the default behavior when creating a table in SQL
It's my understanding that StackOverflow (SO) was built using ASP.NET. What surprised me is
While it's my understanding that there's no fundamental reason a program written for 32-bit

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.