2013-08-28 109 views
6

我正在学习如何使用Python多处理库。然而,当我通过一些例子时,我结束了许多在我的后台运行的python进程。Python多处理杀死进程

其中example的样子如下:

from multiprocessing import Process, Lock 

def f(l, i): 
    l.acquire() 
    print 'hello world', i 
    l.release() 

if __name__ == '__main__': 
    lock = Lock() 

    for num in range(10): # I changed the number of iterations from 10 to 1000... 
     Process(target=f, args=(lock, num)).start() 

现在,这里是我的 'TOP' 命令的屏幕截图:

88950 Python  0.0 00:00.00 1 0 9  91 1584K 5856K 2320K 1720K 2383M 82441 1  sleeping 1755113321 799 
88949 Python  0.0 00:00.00 1 0 9  91 1584K 5856K 2320K 1720K 2383M 82441 1  sleeping 1755113321 798 
88948 Python  0.0 00:00.00 1 0 9  91 1580K 5856K 2316K 1716K 2383M 82441 1  sleeping 1755113321 797 
88947 Python  0.0 00:00.00 1 0 9  91 1580K 5856K 2316K 1716K 2383M 82441 1  sleeping 1755113321 796 
88946 Python  0.0 00:00.00 1 0 9  91 1576K 5856K 2312K 1712K 2383M 82441 1  sleeping 1755113321 795 
88945 Python  0.0 00:00.00 1 0 9  91 1576K 5856K 2312K 1712K 2383M 82441 1  sleeping 1755113321 794 
88944 Python  0.0 00:00.00 1 0 9  91 1576K 5856K 2312K 1712K 2383M 82441 1  sleeping 1755113321 794 
88943 Python  0.0 00:00.00 1 0 9  91 1572K 5856K 2308K 1708K 2383M 82441 1  sleeping 1755113321 792 
88942 Python  0.0 00:00.00 1 0 9  91 1568K 5856K 2304K 1708K 2383M 82441 1  sleeping 1755113321 790 
88941 Python  0.0 00:00.00 1 0 9  91 1564K 5856K 2300K 1704K 2383M 82441 1  sleeping 1755113321 789 
88938 Python  0.0 00:00.00 1 0 9  91 1564K 5856K 2300K 1704K 2383M 82441 1  sleeping 1755113321 788 
88936 Python  0.0 00:00.00 1 0 9  91 1576K 5856K 2296K 1716K 2383M 82441 1  sleeping 1755113321 787 
88935 Python  0.0 00:00.00 1 0 9  91 1560K 5856K 2296K 1700K 2383M 82441 1  sleeping 1755113321 787 
88934 Python  0.0 00:00.00 1 0 9  91 1560K 5856K 2296K 1700K 2383M 82441 1  sleeping 1755113321 786 
88933 Python  0.0 00:00.00 1 0 9  91 1556K 5856K 2292K 1696K 2383M 82441 1  sleeping 1755113321 785 
88932 Python  0.0 00:00.00 1 0 9  91 1556K 5856K 2292K 1696K 2383M 82441 1  sleeping 1755113321 784 
88931 Python  0.0 00:00.00 1 0 9  91 1552K 5856K 2288K 1692K 2383M 82441 1  sleeping 1755113321 783 
88930 Python  0.0 00:00.00 1 0 9  91 1612K 5856K 2288K 1752K 2383M 82441 1  sleeping 1755113321 783 
88929 Python  0.0 00:00.00 1 0 9  91 1588K 5856K 2288K 1728K 2383M 82441 1  sleeping 1755113321 782 
88927 Python  0.0 00:00.00 1 0 9  91 1608K 5856K 2284K 1748K 2383M 82441 1  sleeping 1755113321 781 
88926 Python  0.0 00:00.00 1 0 9  91 1548K 5856K 2284K 1688K 2383M 82441 1  sleeping 1755113321 780 
88924 Python  0.0 00:00.00 1 0 9  91 1556K 5856K 2276K 1700K 2383M 82441 1  sleeping 1755113321 778 
88923 Python  0.0 00:00.00 1 0 9  91 1540K 5856K 2276K 1684K 2383M 82441 1  sleeping 1755113321 777 
88922 Python  0.0 00:00.00 1 0 9  91 1540K 5856K 2276K 1684K 2383M 82441 1  sleeping 1755113321 776 
88921 Python  0.0 00:00.00 1 0 9  91 1536K 5856K 2272K 1680K 2383M 82441 1  sleeping 1755113321 774 
88920 Python  0.0 00:00.00 1 0 9  91 1528K 5856K 2264K 1672K 2383M 82441 1  sleeping 1755113321 771 
88919 Python  0.0 00:00.00 1 0 9  91 1528K 5856K 2264K 1672K 2383M 82441 1  sleeping 1755113321 771 
88918 Python  0.0 00:00.00 1 0 9  91 1528K 5856K 2264K 1672K 2383M 82441 1  sleeping 1755113321 770 
.... 
  1. 我不知道怎么杀他们一气呵成。

    ps ... | grep python .... kill?

  2. 我需要添加什么类型的python代码才能避免这种悲惨的情况。谢谢!

回答

3

您需要。加入()在工人队列的过程,这将他们锁定到调用应用程序,直到所有的人都成功,或者当父母被杀害杀死,并在后台模式下运行。

http://forums.xkcd.com/viewtopic.php?f=11&t=94726

end daemon processes with multiprocessing module

http://docs.python.org/2/library/multiprocessing.html#the-process-class

http://www.python.org/dev/peps/pep-3143/#correct-daemon-behaviour

+1

这是'你应该有...'的代码,以避免这种情况再次发生,对吧?你知道如何杀死多处理产生的所有进程吗? –

5

布雷克VandeMerwe指出答案是上市及以下希望解释可以为其他用户有所帮助:

Original Author

kill -9 `ps -ef | grep test.py | grep -v grep | awk '{print $2}'` 

阐释:

  1. “PS -ef”:显示所有的过程,包括那些没有控制终端,它是完全由多库产生的无数方法。

  2. “grep test.py”:找到这个脚本生成的所有进程,这是我的python脚本的名字。

  3. “的grep -v grep的”:排除在 '杀人名单' 上的grep操作本身

  4. “的awk '{打印$ 2}'”:用AWK到每一个记录分成行并打印出在这种情况下,第二行是进程id colum。

  5. “kill -9”是强制杀死进程,参数应该是UID。前面步骤的完整输出由“`”放在一起,“`”是常规键盘上编号1左侧的字符。将其视为一个变量并通过杀价值。

+1

-1。没有! [不](HTTP://unix.stackexchange。com/q/8916/20714)[just](http://partmaps.org/era/unix/award.html#uuk9letter)['SIGKILL'](https://en.wikipedia.org/wiki/Unix_signal# SIGKILL)[first!](http://superuser.com/a/137400/144700) –