python multiprocess无法启动
作者:互联网
这是我在python中进行简单多处理任务的代码
from multiprocessing import Process
def myfunc(num):
tmp = num * num
print 'squared O/P will be ', tmp
return(tmp)
a = [ i**3 for i in range(5)] ## just defining a list
task = [Process(target = myfunc, args = (i,)) for i in a] ## creating processes
for each in task : each.start() # starting processes <------ problem line
for each in task : each.join() # waiting all to finish up
当我运行此代码时,它会挂在某个位置,因此为了识别它,我在python shell中一行一行地运行它,发现当我调用“ each.start()”时,shell弹出对话框,如下所示:
" The program is still running , do you want to kill it? '
然后我选择“是”,外壳关闭.
当我用’threading.Thread’替换Process时,将运行相同的代码,但输出如下:
Squared Squared Squared Squared Squared 0 1491625
36496481
在这方面有什么帮助吗?预先感谢
要运行我的python代码,请使用Idlex IDE,然后从终端启动它.
我有带4核/ 8线程和8GB RAM的Intel Xeon处理器
解决方法:
稍加思考,我终于找到了问题所在.
之所以发生这种情况,是因为在Python中,float和int对象不是“线程安全的”,这意味着分配给一个线程/进程计算任何函数值的内存可以被另一个线程/进程覆盖,因此它们显示出荒谬的值.这称为竞争条件.
要解决此问题,请使用collections模块中的deque(),甚至更好地使用“ Lock”功能. deque()可用于数组,但它适用于相同类型的数组(非常类似于MATLAB数组),并且是线程/进程安全的. “锁定”避免了比赛条件.
所以编辑将是:
def myfunc(num):
lock.acquire()
.......some code .....
.......some code......
lock.release()
就这样.
但是一个问题仍然存在,那就是多处理模块.即使调用了“锁定”,问题中提到的问题仍然存在.
标签:python-idle,python,multithreading,multiprocessing 来源: https://codeday.me/bug/20191009/1878948.html