【问题标题】:Python multithreading for separate mutually exclusive tasks用于单独互斥任务的 Python 多线程
【发布时间】:2017-08-07 07:57:05
【问题描述】:

假设您有 4 个数字,您需要使用 Python 中的多线程打印从 1 到 100 的所有数字的乘法表。我想出的代码是

from threading import Thread

def multable(r, number):
    for i in range(1,101):
        mul = number*i
        print "\n%d x %d = %d" %(number, i, mul)


def Main():
    t1 = Thread(target = multable, args = (1, 2))
    t2 = Thread(target = multable, args = (1, 3))
    t3 = Thread(target = multable, args = (1, 4))
    t4 = Thread(target = multable, args = (1, 4))
    t1.start()
    t2.start()
    t3.start()
    t4.start()

if __name__ == '__main__':
    Main()

部分输出 -

4 x 60 = 240

4 x 61 = 244

4 x 62 = 248

3 x 48 = 144

2 x 78 = 156
4 x 63 = 252
3 x 49 = 147



3 x 50 = 150

2 x 79 = 158
3 x 51 = 153


4 x 64 = 256

我的问题是 -

  • 为什么会出现不均匀的间距,因为我认为打印语句中的 \n 应该在两个输出之间只有一个行间距?
  • 为什么我不能只在线程中传递一个变量作为参数,这样做的错误要求我给出一个迭代,所以我给出了一个无用的值?
  • 在四核 CPU 中,如何编辑此程序以利用所有四个 CPU,每个 CPU 用于一个数字/线程。不考虑输出顺序?

【问题讨论】:

    标签: python multithreading python-2.7 multicore


    【解决方案1】:

    为什么会有不均匀的间距,因为我认为应该只有一个行间距 在两个输出之间,通过 print 语句中的 \n?

    我认为您遇到了间距问题,因为 python 在每个新行上刷新标准输出缓冲区。由于您在多个线程中执行此操作,因此无法保证顺序,这会导致每次刷新中写入的数据以随机顺序写入。

    为什么我不能只在线程中传递一个变量作为参数, 我这样做的错误要求我给出一个迭代,所以我给出了一个 没用的价值?

    如果你在 () 中放置一个值,例如 (5),它实际上只是意味着 5。你需要添加一个逗号让 python 认为它是一个元组 (5,)。或者您可以使用列表 [5]。

    在四核 CPU 中,如何编辑此程序以利用所有 四个 CPU,每个 CPU 用于一个数字/线程。不顾顺序 输出?

    这应该会自动发生。由操作系统来安排它。如果它看到 4 个单独的线程,它应该在每个核心上放置一个(取决于任务调度程序)。由于两个原因,您可能无法在任务管理器中看到 100% 的所有 4 个核心。首先是python解释器并不真正支持多线程。每个 python 语句都被锁定,因此一次只能执行一个语句。如果您正在为 python 创建 C 扩展,则可以解决此问题,但是需要锁定对 python 解释器的所有调用。其次,即使你用 C 写了同样的东西,我怀疑你会在任务管理器中看到这烧毁了所有内核。这是一个非常轻量级和大量 IO 的进程,不会占用太多 CPU。

    【讨论】:

      【解决方案2】:

      由于您使用线程,每个线程都有自己的输出,这导致它们每隔一段时间就会同时将\n 传递给控制台。此行为导致您看到不同的空行。

      至于传递参数,你可以通过以下方式传递一个元组:

      from threading import Thread
      
      
      def multable(number):
          for i in range(1, 101):
              mul = number * i
              print "%d x %d = %d\n" % (number, i, mul)
      
      
      def Main():
          t1 = Thread(target=multable, args=(2,))
          t2 = Thread(target=multable, args=(3,))
          t3 = Thread(target=multable, args=(4,))
          t4 = Thread(target=multable, args=(4,))
          t1.start()
          t2.start()
          t3.start()
          t4.start()
      
      
      if __name__ == '__main__':
          Main()
      

      从而去除多余的参数。我建议你使用Queue 来打印输出,这样你可以更好地控制它。

      类似:

      from threading import Thread
      from Queue import Queue
      
      
      def multable(number):
          for i in range(1, 101):
              mul = number * i
              q.put("%d x %d = %d\n" % (number, i, mul))
              q.task_done()
      
      
      def main():
      
          t1 = Thread(target=multable, args=(2,))
          t2 = Thread(target=multable, args=(3,))
          t3 = Thread(target=multable, args=(4,))
          t4 = Thread(target=multable, args=(4,))
          t1.start()
          t2.start()
          t3.start()
          t4.start()
      
          q.join()
      
          while not q.empty():
              print '{}\n'.format(q.get())
      
      if __name__ == '__main__':
          q = Queue()
          main()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-08
        • 2020-09-19
        • 2016-12-27
        • 2023-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-25
        相关资源
        最近更新 更多