Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.7k
Description
Bug report
I have a project that uses threading.Thread and multiprocessing.Process for handling concurrent tasks. While under certain circumstances, there is the possibility that when I try new aProcess() instance and call theProcess.start() function, an error would occur:AttributeError: 'NoneType' object has no attribute 'poll'
I tried debugging my project and found that under themultiprocessing.process module a global variable_children is used for managing all child processes, the variable is not thread-safe and the error would occur occasionally. I made a simple test code with minor modification on themultiprocessing.process
test.py
frommultiprocessingimportProcessfromthreadingimportThreaddefhelper():time.sleep(0.1)return1defclose_process(p_:Process):p.terminate()p_.close()if__name__=="__main__":process_list= []for_inrange(1):p=Process(target=helper)p.start()time.sleep(0.2)process_list.append(p)for_inrange(1):t=Thread(target=close_process,args=(process_list[_],))t.start()new_p=Process(target=helper)time.sleep(0.2)new_p.start()
multiprocessing.process.py class BaseProcess
defclose(self):''' Close the Process object. This method releases resources held by the Process object. It is an error to call this method if the child process is still running. '''ifself._popenisnotNone:ifself._popen.poll()isNone:raiseValueError("Cannot close a process while it is still running. ""You should first call join() or terminate().")self._popen.close()self._popen=Noneimporttimetime.sleep(5)delself._sentinel_children.discard(self)self._closed=True
I simply addtime.sleep() forBaseProcess.close() class and now every time I run the test.py, the error would occur.
Your environment
- CPython versions tested on: python 3.7
- Operating system and architecture: windows 10 or linux el7