如何简化此脚本

时间:2013-07-17 21:20:03

标签: python variables global multiprocess

我有这个脚本,它确实有效,它有2个独立的进程,当kill通过管道发送给监听器时,它会产生监听器线程以终止进程。

   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 个答案:

答案 0 :(得分: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

e.g。

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