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
,我认为两个输出之间应该只有一行间距,为什么间距不均匀?
- 为什么我不能在线程中只传递一个变量作为参数,我这样做的错误要求我给出一个迭代,所以我给出了一个无用的值?
- 在四核 CPU 中,如何编辑此程序以利用所有四个 CPU,每个 number/thread。无视输出顺序?
由于您使用的是线程,每个线程都有自己的输出,这导致它们每隔一段时间就会同时将 \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.
假设您有 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
,我认为两个输出之间应该只有一行间距,为什么间距不均匀? - 为什么我不能在线程中只传递一个变量作为参数,我这样做的错误要求我给出一个迭代,所以我给出了一个无用的值?
- 在四核 CPU 中,如何编辑此程序以利用所有四个 CPU,每个 number/thread。无视输出顺序?
由于您使用的是线程,每个线程都有自己的输出,这导致它们每隔一段时间就会同时将 \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.