python多进程无法启动

时间:2013-12-24 12:21:52

标签: python multithreading multiprocessing python-idle

这是我在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

2 个答案:

答案 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()

弄糊涂了