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

Python multithreading for separate mutually exclusive tasks

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

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 传递给控制台。此行为导致您看到不同的空行。

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

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

Why is there uneven spacing, as I think there should only one line gap between two outputs, by the \n in the print statement?

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

Why can't I just pass only one variable as parameter in the thread, the error I get in doing so asks me to give an iterative, so I gave an useless value?

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

In a quad-core CPU, how can I edit this program to make use of all four CPUs, each for one number/thread. disregarding the order of output?

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