如何在不锁定python主程序的情况下在新线程中启动函数?
我试图在一个新的线程中启动一个函数,因为该函数使得某些东西与主程序无关。如何在不锁定python主程序的情况下在新线程中启动函数?
我试图与多处理模块,以做到这一点:
import multiprocessing
import time
def mp_worker(a):
#time.sleep(a)
print('a:' +str(a))
return
for k in range(5):
p = multiprocessing.Process(target= mp_worker , args=(k,))
p.start()
print('keep going :' + str(k))
但是我有一大堆的错误:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Anaconda3\lib\multiprocessing\spawn.py", line 106, in spawn_main
exitcode = _main(fd)
File "C:\Anaconda3\lib\multiprocessing\spawn.py", line 115, in _main
prepare(preparation_data)
File "C:\Anaconda3\lib\multiprocessing\spawn.py", line 226, in prepare
_fixup_main_from_path(data['init_main_from_path'])
File "C:\Anaconda3\lib\multiprocessing\spawn.py", line 278, in _fixup_main_from_path
run_name="__mp_main__")
File "C:\Anaconda3\lib\runpy.py", line 254, in run_path
pkg_name=pkg_name, script_name=fname)
File "C:\Anaconda3\lib\runpy.py", line 96, in _run_module_code
mod_name, mod_spec, pkg_name, script_name)
File "C:\Anaconda3\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\Users\Maxime\PycharmProjects\NeuralMassModelSofware_Pyqt5\dj.py", line 14, in <module>
p.start()
File "C:\Anaconda3\lib\multiprocessing\process.py", line 105, in start
self._popen = self._Popen(self)
File "C:\Anaconda3\lib\multiprocessing\context.py", line 212, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "C:\Anaconda3\lib\multiprocessing\context.py", line 313, in _Popen
return Popen(process_obj)
File "C:\Anaconda3\lib\multiprocessing\popen_spawn_win32.py", line 34, in __init__
prep_data = spawn.get_preparation_data(process_obj._name)
File "C:\Anaconda3\lib\multiprocessing\spawn.py", line 144, in get_preparation_data
_check_not_importing_main()
File "C:\Anaconda3\lib\multiprocessing\spawn.py", line 137, in _check_not_importing_main
is not going to be frozen to produce an executable.''')
RuntimeError:
An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.
This probably means that you are not using fork to start your
child processes and you have forgotten to use the proper idiom
in the main module:
if __name__ == '__main__':
freeze_support()
...
The "freeze_support()" line can be omitted if the program
is not going to be frozen to produce an executable.
有人知道我怎么能推出我想要的功能,在一个新的线程并确保主程序仍然正常运行?我有点迷失于多处理,我承认:) 我的目标是在不中断主程序的情况下在新线程中为用户启动一些显示器(图形或打印,但我还不知道)。
你在做什么不是multithreading
,这是muliprocessing
。
更改。
multiprocessing.Process(...
与。
threading.Thread(...
的Python»3.6.1文档:threading.Thread
SO Q &答:multiprocessing-vs-threading-python
在这旁边,你可以克服错误添加time.sleep(0.2)
后start(...
这是运行你所提供的代码时,我所得到:
python3.6 -u "multiprocessingError_Cg.py"
keep going :0
a:0
keep going :1
keep going :2
a:1
a:2
keep going :3
keep going :4
a:3
a:4
>Exit code: 0
所以回答你的问题是,你必须寻找其他地方多处理该故障的原因,但不是在您的问题中列出的代码部分。
仔细看看答案和评论中提供了什么here - 也许它可以帮助你的情况吗?
这里发生了什么在评论中说的答案有一个:
Dave: Would this work if beBusyFor (in your case mp_worker) uses multiprocessing internally?
@Dave just try it out and report back here if it worked. Haven't tested such a case yet, so my opinion that it should work leaving some mess of processes with no parents doesn't matter here and therefore shouldn't be taken in consideration.
Dave: **No cigar ending child processes unfortunately** :(
谢谢您的回答。我有python3.5。你认为我需要升级python和multiprocessing包来面对我的问题吗?仍然不明白为什么这附加! – ymmx
感谢您的回答,但它提出了一个错误: AttributeError:模块'多处理'没有属性'线程' – ymmx
@ymmx:对不起,应该读'threading.Thread(...' – stovfl
谢谢,现在的作品。有点混淆,这两个模块之间的主要区别是什么,它们看起来如此接近。 – ymmx