Python线程执行阻塞其他线程

2024-09-29 21:32:33 发布

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

如果被访问,两个线程都可以工作,但是当它们一起执行时,halt_listener将独占不允许{}执行的资源。最终目标是让halt_listener监听kill消息,然后将run变量设置为false。当我向halt_侦听器发送一个管道时,这是有效的,但我更喜欢队列。在

这是我的代码:

import multiprocessing 
import time 
from threading import Thread

class test_imports:#Test classes remove 
      alive = {'import_1': True, 'import_2': True};

      def halt_listener(self, control_Queue, thread_Name, kill_command):
          while True:
              print ("Checking queue for kill")
              isAlive = control_queue.get()
              print ("isAlive", isAlive)
              if isAlive == kill_command:
                 print ("kill listener triggered")
                 self.alive[thread_Name] = False;
                 return

      def import_1(self, control_Queue, thread_Number):
          print ("Import_1 number %d started") % thread_Number
          halt = test_imports()
          t = Thread(target=halt.halt_listener, args=(control_Queue, 'import_1', 't1kill'))
          count = 0 
          t.run()
          global alive 
          run = test_imports.alive['import_1'];
          while run:
                print ("Thread type 1 number %d run count %d") % (thread_Number, count)
                count = count + 1
                print ("Test Import_1 ", run)
                run = self.alive['import_1'];
          print ("Killing thread type 1 number %d") % thread_Number 

我错过什么了吗?在


Tags: runtestimportselfnumbercountthreadcontrol
1条回答
网友
1楼 · 发布于 2024-09-29 21:32:33

问题是您正在调用t.run()run不是启动线程的方法;run是要在线程上运行的实际代码。通过直接调用它,就可以在线程上运行它,并等待它完成。在

你想要的是t.start()。在

有关详细信息,请参阅^{}上的文档。在


在我们讨论的时候,您的代码还有一些其他问题。在

首先,self.alive周围没有锁。您不能在一个线程中更改一个值(除了少数自动自同步的类型,如Queue)并在另一个线程中访问它而不需要锁。通常情况下,多线程程序中的“经常”只是意味着它在大型演示之前不会失败,然后在开始修复它之前需要数周的时间来确定如何重新生成……(在这种情况下,条件可能比锁更合理,但不管怎样,您需要在上同步

同时,尽可能快地循环轮询self.alive['import_1']将消耗100%的CPU,这是毫无道理的。几乎总是有更好的方法来等待某件事(例如,在这种情况下,如果您使用了一个条件来进行同步,您也可以在这里使用它来等待);在很少的情况下,如果没有,您应该在循环中每次至少sleep。在

alive实际上是一个类属性,而不是一个实例属性。这通常不是你想要的。事实上,您试图同时访问test_imports.alive和{},但只要您从未分配给它们,这两个属性都将成为class属性,这会使它更加混乱。然后,除此之外,你还有一个同名的全局变量,这只会导致极度混乱。在

另外,这看起来像Python2代码,但是您使用的print就好像在某些情况下它是一个函数一样—例如,print ("isAlive", isAlive)。这不是你想做的,而不是打印像isAlive command这样的东西,而是要打印('isAlive', 'command')这样的东西,这不是很漂亮。同时,像("Import_1 number %d started") % thread_Number这样的表达式中的额外括号意味着某人必须读几遍才能让自己相信括号实际上没有做任何事情。在

最后,为什么要创建一个单独的test_imports实例来调用halt_listener?显然,这两个方法试图通过self上的属性进行通信,但是如果在两个不同的对象上调用它们,它们就不会这样做。为什么不只是target=self.half_listener?在

相关问题 更多 >

    热门问题