今天我开始进行多处理,当然还有一些问题。
我创建了两个流程:
import multiprocessing as mp
# twitter parser
twitterProc = mp.Process ( target=TwitterProcess )
twitterProc.start()
# rss parser
RssProc = mp.Process ( target=RssProcess )
RssProc.start()
当代码启动RssProc时,它会工作1-2秒,启动第一个进程(twitterProc)并且它正常工作,然后启动第二个进程,1-2秒后它会停止并显示错误列表:
Connected to pydev debugger (build 172.3757.67)
Traceback (most recent call last):
Error in atexit._run_exitfuncs: File "_pydevd_bundle/pydevd_cython.pyx", line 735, in _pydevd_bundle.pydevd_cython.PyDBFrame.trace_dispatch (_pydevd_bundle/pydevd_cython.c:15637)
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/atexit.py", line 24, in _run_exitfuncs
func(*targs, **kargs)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/util.py", line 325, in _exit_function
p.join()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 145, in join
self.do_wait_suspend(thread, frame, event, arg)
File "_pydevd_bundle/pydevd_cython.pyx", line 252, in _pydevd_bundle.pydevd_cython.PyDBFrame.do_wait_suspend (_pydevd_bundle/pydevd_cython.c:5643)
self._args[0].do_wait_suspend(*args, **kwargs)
File "/Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py", line 767, in do_wait_suspend
res = self._popen.wait(timeout)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/forking.py", line 154, in wait
return self.poll(0)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/forking.py", line 135, in poll pid, sts = os.waitpid(self.pid, flag)
KeyboardInterrupt
time.sleep(0.01)
KeyboardInterrupt
Process Process-RSS:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
Error in sys.exitfunc:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/atexit.py", line 24, in _run_exitfuncs
func(*targs, **kargs)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/util.py", line 325, in _exit_function
self.run()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 114, in run
p.join()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 145, in join
self._target(*self._args, **self._kwargs)
File "/Users/Stas/PycharmProjects/untitled/streambot.py", line 674, in __init__
res = self._popen.wait(timeout)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/forking.py", line 154, in wait
return self.poll(0)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/forking.py", line 135, in poll
pid, sts = os.waitpid(self.pid, flag)
KeyboardInterrupt
for source in config.feedList:
File "/Users/Stas/PycharmProjects/untitled/streambot.py", line 674, in __init__
for source in config.feedList:
File "_pydevd_bundle/pydevd_cython.pyx", line 970, in _pydevd_bundle.pydevd_cython.SafeCallWrapper.__call__ (_pydevd_bundle/pydevd_cython.c:19428)
ret = (<object>method_obj)(*args)
File "_pydevd_bundle/pydevd_cython.pyx", line 501, in _pydevd_bundle.pydevd_cython.PyDBFrame.trace_dispatch (_pydevd_bundle/pydevd_cython.c:18762)
cpdef trace_dispatch(self, frame, str event, arg):
File "_pydevd_bundle/pydevd_cython.pyx", line 744, in _pydevd_bundle.pydevd_cython.PyDBFrame.trace_dispatch (_pydevd_bundle/pydevd_cython.c:15791)
raise
File "_pydevd_bundle/pydevd_cython.pyx", line 735, in _pydevd_bundle.pydevd_cython.PyDBFrame.trace_dispatch (_pydevd_bundle/pydevd_cython.c:15637)
self.do_wait_suspend(thread, frame, event, arg)
File "_pydevd_bundle/pydevd_cython.pyx", line 252, in _pydevd_bundle.pydevd_cython.PyDBFrame.do_wait_suspend (_pydevd_bundle/pydevd_cython.c:5643)
self._args[0].do_wait_suspend(*args, **kwargs)
File "/Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py", line 767, in do_wait_suspend
time.sleep(0.01)
KeyboardInterrupt
Process finished with exit code 0
这是什么以及如何解决?
答案 0 :(得分:0)
我认为最好的方法是在创建Process之后使用join
方法。 join通知主线程等待进程完成它的工作
twitterProc.join()
和RssProc.join()