为什么我的python线程对全局变量没有反应

2024-04-26 11:15:04 发布

您现在位置:Python中文网/ 问答频道 /正文

此代码用于启动和停止各种不同线程类型的多个副本。我将在这篇文章的开头说,我尝试使用管道来控制线程,但不断得到随机内存错误与管道有关。这是一个工厂的原型,可以生产多个线程类型的多个副本,因此队列方法对我来说似乎也不实用,尽管如果我遗漏了什么,我会洗耳恭听。因此,我的最新计划是使用一个全局字典,对每个线程和线程终止条件使用不同的条目。即sub[Alive]subKill["kill"]

但是由于某些原因,进程产生的control_listener线程不会触发kill条件,也不会读取全局变量。你知道吗

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


alive = {'subAlive': True, 'subKill': "Alive", 'testAlive': True, 'testKill': "Alive"};


def control_listener(aliveFlag, threadAlive): #listens for kill from main
    global alive
    while True:
          data = alive[aliveFlag];
          print "Thread", alive[threadAlive];
          print "Thread status", alive[aliveFlag];
          if data == "kill":
             print "Killing"
             alive[threadAlive] = False; #value for kill
             print "testListner alive %s" % threadAlive, alive[threadAlive];
             print "deactivating %s" % threadAlive, alive['aliveFlag'];
             break

def subprocess(aliveFlag, threadNum, threadAlive):
    t = Thread(target=control_listener, args=(aliveFlag, threadAlive))
    count = 0
    threadVal = threadNum 
    t.start()
    run = alive['subAlive'];
    while run == True:
          print "Thread alive %s" % alive['aliveFlag'];
          print "Thread %d Run number = %d" % (threadVal, count), alive['subAlive'];
          count = count + 1
          run = alive['subAlive']; 


def testprocess(aliveFlag, threadNum, threadAlive):
    t = Thread(target=control_listener, args=(aliveFlag, threadAlive))
    count = 0
    threadVal = threadNum 
    t.start()
    run = alive['testAlive'];
    while run == True:
          print "This is a different thread %d Run = %d" % (threadVal, count)
          count = count + 1
          run = alive['testAlive'];


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=('subKill', i, 'subAlive'))
    p.start()

print "Subprocess started"

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

print "Testproccess started"

print "Starting run"

time.sleep(runNum) 

print "Terminating Subprocess run"
for i in range(threadNum):
    alive['subKill'] = "kill"; 
    print "Subkill = %s" % alive['subKill'];
    print "Testprocess termination alive", alive['subAlive'];

print "Terminating Testprocess run"
for i in range(threadNum):
    alive['subKill'] = "kill"; 
    print "Testprocess termination alive", alive['subAlive'];

p.join()
p2.join()

Tags: runtrueforcount线程threadcontrolkill