2013-07-17 53 views
1

我有这个脚本,它有它的工作,它有2个独立的进程产生监听线程杀死进程时,通过管道发送到监听器。如何简化这个脚本

from multiprocessing import Process, Pipe 
    from threading import Thread 
    import time 

    subAlive = True 
    testAlive = True 

    def sub_listener(conn): #listens for kill from main 
     global subAlive 
     while True: 
      data = conn.recv() 
      if data == "kill": 
      subAlive = False #value for kill 
      break 

    def test_listener(conn): #listens for kill from main 
     global testAlive 
     while True: 
       data = conn.recv() 
       if data == "kill": 
       testAlive = False #value for kill 
       break 

    def subprocess(conn, threadNum): 
     t = Thread(target=sub_listener, args=(conn,)) 
     count = 0 
     threadVal = threadNum 
     t.start() 
     while subAlive: 
       print "Thread %d Run number = %d" % (threadVal, count) 
       count = count + 1 


    def testprocess(conn, threadNum): 
     t = Thread(target=test_listener, args=(conn,)) 
     count = 0 
     threadVal = threadNum 
     t.start() 
     while testAlive: 
       print "This is a different thread %d Run = %d" % (threadVal, count) 
       count = count + 1 


    sub_parent, sub_child = Pipe() 
    test_parent, test_child = Pipe() 
    runNum = int(raw_input("Enter a number: ")) 
    threadNum = int(raw_input("Enter number of threads: ")) 

    print "Starting threads" 

    for i in range(threadNum): 
     p = Process(target=subprocess, args=(sub_child, i)) 
     p.start() 

    print "Subprocess started" 

    for i in range(threadNum): 
     p2 = Process(target=testprocess, args=(test_child, i)) 
     p2.start() 

    print "Testproccess started" 

    print "Starting run" 

    time.sleep(runNum) 

    print "Terminating Subprocess run" 
    for i in range(threadNum): 
     sub_parent.send("kill") #sends kill to listener 

    print "Terminating Testprocess run" 
    for i in range(threadNum): 
     test_parent.send("kill") #sends kill to listener 

    p.join() 
    p2.join() 

我喜欢不需要一个单独的侦听器函数硬编码为我调用的每个进程。我正在考虑在线程产生时传递全局变量。全局变量实际上是侦听器函数之间的唯一区别。多谢你们!

+1

您能否修理缩进?谢谢:) – woozyking

+0

修好了他们对不起 –

+0

现在看起来很好:)谢谢。 – woozyking

回答

2

您可以通过globals()字典访问全局变量。

>>> foo = 'value' 
>>> def change(name): 
... globals()[name] = 'changed' 
... 
>>> change('foo') 
>>> foo 
'changed' 

,但我建议:

alive = {} 
def sub_listener(conn, key): #listens for kill from main 
    while True: 
     data = conn.recv() 
     if data == "kill": 
     alive[key] = False #value for kill 
     break 

例如

from multiprocessing import Process, Pipe 
from threading import Thread 
import time 

alive = { 
    'sub': 1, 
    'test': 1, 
} 

def listener_factory(key): 
    def listener(conn): #listens for kill from main 
     while True: 
      data = conn.recv() 
      if data == "kill": 
       alive[key] = False #value for kill 
       break 
    return listener 

def process_factory(key): 
    listener = listener_factory(key) 
    def subprocess(conn, threadNum): 
     t = Thread(target=listener, args=(conn,)) 
     count = 0 
     threadVal = threadNum 
     t.start() 
     while alive[key]: 
      print "Thread[%s] %d Run number = %d" % (key, threadVal, count) 
      count = count + 1 
    return subprocess 

def main(): 
    sub_parent, sub_child = Pipe() 
    test_parent, test_child = Pipe() 
    runNum = int(raw_input("Enter a number: ")) 
    threadNum = int(raw_input("Enter number of threads: ")) 
    print "Starting threads" 
    for i in range(threadNum): 
     p = Process(target=process_factory('sub'), args=(sub_child, i)) 
     p.start() 
    print "Subprocess started" 
    for i in range(threadNum): 
     p2 = Process(target=process_factory('test'), args=(test_child, i)) 
     p2.start() 
    print "Testproccess started" 
    print "Starting run" 
    time.sleep(runNum) 
    print "Terminating Subprocess run" 
    for i in range(threadNum): 
     sub_parent.send("kill") #sends kill to listener 
    print "Terminating Testprocess run" 
    for i in range(threadNum): 
     test_parent.send("kill") #sends kill to listener 
    p.join() 
    p2.join() 

if __name__ == '__main__': 
    main() 
+0

与我有什么不同?看起来你只是将全局变量凝聚而不是将监听器线程合并为一个列表器,这要感谢字典是一个巧妙的技巧,尽管 –

+0

是的,我看到了这个工作原理,这正是我想要的感谢! –