Python多线程用于单独的互斥任务

时间:2017-08-07 07:57:05

标签: python multithreading python-2.7 multicore

假设您有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用于一个数字/线程。无视输出的顺序?

2 个答案:

答案 0 :(得分:1)

  

为什么有不均匀的间距,因为我认为应该只有一个线间隙   在两个输出之间,由print语句中的\ n开始?

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

  

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

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

  

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

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

答案 1 :(得分:0)

由于您使用线程,每个线程都有自己的输出,这导致每隔一段时间它们会同时将\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()