假设您有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
?答案 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()