This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: self.terminate() from a multiprocessing.Process raises AttributeError exception
Type: Stage: resolved
Components: Versions: Python 3.2
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: jnoller Nosy List: 5houston, asksol, jnoller, sbt
Priority: normal Keywords: patch

Created on 2010-02-27 19:58 by 5houston, last changed 2022-04-11 14:56 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
pythonProcBug.tar.bz2 5houston, 2010-02-27 19:58 It contains a piece of code to reproduce the problem.
minCrashing.py.bz2 5houston, 2010-10-06 19:05
i8028.patch asksol, 2010-11-02 15:16
Messages (14)
msg100191 - (view) Author: (5houston) Date: 2010-02-27 19:58
Try to execute "python -OO crashingMain.py" using python 3.1 or 3.1.1.

It creates and starts 5 SendingProcess(es).
SendingProcess inherits from multiprocessing.Process and multiprocessing.queue.Queue.

Each process starts a loop.

In the meanwhile the main, calling close() method of each SendingProcess, puts 1 into each SendingProcess and each SendingProcess, when it self.get(s) it, calls self.terminate.

This causes a AttributeError exception for each SendingProcess.

workingMain.py instead does not call close() method.
It calls directly the terminate method of each SendingProcess.
msg100192 - (view) Author: (5houston) Date: 2010-02-27 20:01
Obiouvsly you can find crashingMain.py and workingMain.py in the attached file.
msg118016 - (view) Author: Ask Solem (asksol) (Python committer) Date: 2010-10-05 15:09
Could you please reduce this to the shorted possible example that reproduces the problem?
msg118075 - (view) Author: (5houston) Date: 2010-10-06 19:05
Yes I could. You can find it attached.
msg120229 - (view) Author: Ask Solem (asksol) (Python committer) Date: 2010-11-02 15:16
It seems that Process.terminate is not meant to be used by the child, but only the parent.

From the documentation:

  "Note that the start(), join(), is_alive() and exit_code methods
  should only be called by the process that created the process object."

Either terminate() should be added to this list,
or terminate should be patch to call sys.exit in a child process.

I vote for the former, so I attached a doc patch.
msg120331 - (view) Author: (5houston) Date: 2010-11-03 17:37
I vote for the latter.
msg120345 - (view) Author: Ask Solem (asksol) (Python committer) Date: 2010-11-03 20:38
Since you can't specify the return code, `self.terminate` is less flexible than `sys.exit`.

I think the original intent is clear here, the method is there for the parent to control the child.  You are of course welcome to argue otherwise.

By the way, I just read the code and noticed that it handles SystemExit well, and supports using it to set the return code:

    class X(Process):
        def run(self):
            if not frobulating:
                raise SystemExit(255)
msg120505 - (view) Author: Jesse Noller (jnoller) * (Python committer) Date: 2010-11-05 14:54
Fine w/ committing this Ask as-is ask. You are correct in the original intent of the code.
msg120942 - (view) Author: (5houston) Date: 2010-11-11 11:13
If you will choose the former way, I think it would be better to write in the "multiprocessing.Process" documentation that sys.exit is the function to use to break the process execution inside itself, but maybe it would be better to wrap sys.exit with a new "multiprocessing.Process" method:
multiprocessing.Process.exit([arg]) for example.
Maybe it would be better to modify the sys.exit documentation too.
From "Exit from Python" to "Exit from python process which it is called in".
Or, finally, you could modify "multiprocessing.Process.terminate" in this way (using pseudo-code):

self.terminate():
    if caller is self: sys.exit()
    else: -the current code-
msg121501 - (view) Author: (5houston) Date: 2010-11-19 06:03
Hi.
I tried my code (minCrashing.py) in windows using python 3.1.2, 2.3alpha4 and 3.1.3rc1
The behaviour is deeply different from linux 3.1.2.
I think it's a bug.
What do you think about it?
msg121536 - (view) Author: Jesse Noller (jnoller) * (Python committer) Date: 2010-11-19 15:27
Can you please expand on "deeply different"?
msg121691 - (view) Author: (5houston) Date: 2010-11-20 17:29
Yes, I can.
This is the minCrashing.py output from python3.2a4 in windows XP sp3:

Traceback (most recent call last):
  File "c:\Python32\lib\multiprocessing\process.py", line 233, in _bootstrap
    self.run()
  File "c:\Python32\lib\multiprocessing\process.py", line 87, in run
    if self._target:
AttributeError: 'Process' object has no attribute '_target'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "c:\Python32\lib\multiprocessing\forking.py", line 349, in main
    exitcode = self._bootstrap()
  File "c:\Python32\lib\multiprocessing\process.py", line 249, in _bootstrap
    sys.stderr.write('Process %s:\n' % self.name)
  File "c:\Python32\lib\multiprocessing\process.py", line 137, in name
    return self._name
AttributeError: 'Process' object has no attribute '_name'
msg162530 - (view) Author: Richard Oudkerk (sbt) * (Python committer) Date: 2012-06-08 14:28
One issue with sys.exit() is that it only makes the current thread exit.    Even when called in the main thread, the program will wait for non-daemon threads to finish.  A closer equivalent to terminate() would be
os.kill(os.getpid(), signal.SIGTERM).

The problem with minCrashing.py on Windows is that you are inheriting from Queue which has a __reduce__ method.  Your Process class is trying to use Queue.__reduce__ to pickle itself.  You should really just do "self._queue = Queue()" instead of inheriting from Queue.
msg162623 - (view) Author: Richard Oudkerk (sbt) * (Python committer) Date: 2012-06-11 15:20
The docs were patched in changeset 9fa52478b32b, so I will close.
History
Date User Action Args
2022-04-11 14:56:58adminsetgithub: 52276
2012-06-11 15:20:05sbtsetstatus: open -> closed
resolution: fixed
messages: + msg162623

stage: resolved
2012-06-08 14:28:01sbtsetnosy: + sbt
messages: + msg162530
2010-11-20 17:29:515houstonsetmessages: + msg121691
2010-11-19 15:27:45jnollersetmessages: + msg121536
2010-11-19 06:03:085houstonsetmessages: + msg121501
versions: + Python 3.2, - Python 3.1
2010-11-11 11:13:195houstonsetmessages: + msg120942
2010-11-05 14:54:31jnollersetmessages: + msg120505
2010-11-03 20:38:38asksolsetmessages: + msg120345
2010-11-03 17:37:505houstonsetmessages: + msg120331
2010-11-02 15:16:12asksolsetfiles: + i8028.patch
keywords: + patch
messages: + msg120229
2010-10-06 19:05:315houstonsetfiles: + minCrashing.py.bz2

messages: + msg118075
2010-10-05 15:09:51asksolsetnosy: + asksol
messages: + msg118016
2010-02-27 23:54:17benjamin.petersonsetassignee: jnoller

nosy: + jnoller
2010-02-27 20:01:345houstonsetmessages: + msg100192
2010-02-27 19:58:325houstoncreate