Can't use XMLRPC errors with multiprocessing and pickle
Ouverte
Personne n'a encore pris cette issue.
topic-multiprocessing
type-bug
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 36k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Can't use XMLRPC errors with multiprocessing and pickle modules. Multiprocessing freezes.
Bug example
from multiprocessing import Pool
from xmlrpc.client import ProtocolError
def raise_error(_):
raise ProtocolError("1", 2, "3", {})
Pool(1).map(raise_error, (["A", 5]))
Expected output
Traceback (most recent call last):
File "C:\Program Files\Python310\lib\multiprocessing\pool.py", line 125, in worker
result = (True, func(*args, **kwds))
File "C:\Program Files\Python310\lib\multiprocessing\pool.py", line 48, in mapstar
return list(map(*args))
File "C:\Users\ppatrin\Projects\test.py", line 6, in raise_error
raise ProtocolError("1", 2, "3", {})
xmlrpc.client.ProtocolError: <ProtocolError for 1: 2 3>
Actual output
"C:\Program Files\Python310\python.exe" C:/Users/ppatrin/Projects/test.py
Exception in thread Thread-3 (_handle_results):
Traceback (most recent call last):
File "C:\Program Files\Python310\lib\threading.py", line 1009, in _bootstrap_inner
self.run()
File "C:\Program Files\Python310\lib\threading.py", line 946, in run
self._target(*self._args, **self._kwargs)
File "C:\Program Files\Python310\lib\multiprocessing\pool.py", line 576, in _handle_results
task = get()
File "C:\Program Files\Python310\lib\multiprocessing\connection.py", line 256, in recv
return _ForkingPickler.loads(buf.getbuffer())
TypeError: ProtocolError.__init__() missing 4 required positional arguments: 'url', 'errcode', 'errmsg', and 'headers'
And multiprocessing processes frozes.
Real problem
import pickle
from xmlrpc.client import ProtocolError
pickle.loads(pickle.dumps(ProtocolError(1, "2", 3, {})))
>>> TypeError: __init__() missing 4 required positional arguments: 'url', 'errcode', 'errmsg', and 'headers'
How to fix
We should fix a super call in exception method initializer.
class ProtocolError(Error):
"""Indicates an HTTP protocol error."""
def __init__(self, url, errcode, errmsg, headers):
--- Error.__init__(self)
+++ Error.__init__(self, url, errcode, errmsg, headers)
self.url = url
self.errcode = errcode
self.errmsg = errmsg
self.headers = headers
Your environment
- CPython versions tested on: 3.10.4
- Operating system and architecture: Windows 11 and Ubuntu 20.04.
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par l’initialiseur de ProtocolError dans le module xmlrpc.client et reproduisez l’aller-retour avec pickle présenté dans l’issue. Le travail est terminé lorsque ProtocolError peut être sérialisée et désérialisée avec succès et que l’exemple de multiprocessing ne se fige plus lors du renvoi de l’erreur attendue.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- api, backend
- Type d'issue
- Bug
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Activité
- À l'abandon
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 38/100