Python 多线程处理单独的互斥任务



假设你有 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 会在每个新行上刷新标准输出缓冲区。 由于您在多个线程中执行此操作,因此无法保证顺序,这会导致每次刷新中写入的数据以随机顺序写入。

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

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

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

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

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

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

from threading import Thread

def multable(number):
for i in range(1, 101):
mul = number * i
print "%d x %d = %dn" % (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 = %dn" % (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()

相关内容

  • 没有找到相关文章

最新更新