这是我在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? '
我选择'是'关闭shell。
当我用'threading.Thread'替换Process时,相同的代码运行但是这个无意义的输出:
Squared Squared Squared Squared Squared 0 1491625
36496481
这方面有什么帮助吗?提前谢谢
要运行我的python代码,我使用Idlex IDE,然后从终端启动它。
我的Intel Xeon处理器有4核/ 8线程和8GB RAM
答案 0 :(得分:1)
经过一番思考,我终于找到了问题。
这种情况正在发生,因为在Python中,float和int对象不是“线程安全的”,这意味着分配给一个线程/进程计算任何函数值的内存可以被另一个线程/进程覆盖,因此它们显示出荒谬的值。这被称为竞争条件。
要解决此问题,请使用集合模块中的deque(),或者更好的是使用“Lock”工具。 deque()适用于数组,但它适用于同类数组(非常类似于MATLAB数组),并且是线程/进程安全的。 “锁定”可以避免竞争条件。
所以编辑将是:
def myfunc(num):
lock.acquire()
.......some code .....
.......some code......
lock.release()
就是这样。
但是一个问题仍然存在,那就是多处理模块。即使在调用“锁定”之后,问题中提到的问题仍然存在。
答案 1 :(得分:0)
将上面的代码保存到.py文件中,然后在带有
的gnome-terminal中运行它python myfile.py
“myfile.py”是您保存到的文件名。
我认为你使用的IDE在某种程度上被Process()