【问题标题】:What mistake am I making in this python script?我在这个 python 脚本中犯了什么错误?
【发布时间】:2016-06-28 20:49:38
【问题描述】:

我尝试使用多线程,以便更好地处理它,但由于某些奇怪的原因,我的代码不想遵循命令。假设进入一个while循环并打印,但它没有,而且它也没有引发任何错误,那么错误在哪一行?

#!/usr/bin/env python 
#
#
#
import random
import thread
import time
import sys
import os


def DisplayA(name,wait):
    while True:
        print 'Display: 1';time.sleep(wait)


def DisplayB(name,wait):
    while True:
        print 'Display: 2';time.sleep(wait)


def DisplayC(name,wait):
    while True:
        print 'Display: 3';time.sleep(wait)



thread.start_new_thread(DisplayA,('Display1',2))
thread.start_new_thread(DisplayB,('Display2',3))
thread.start_new_thread(DisplayC,('Display3',5))

【问题讨论】:

  • 这在我的终端上可以正常工作... ...
  • 您看到的输出是什么?什么都没有?另外,哪个版本的 Python,在哪个操作系统上?

标签: python multithreading python-2.7


【解决方案1】:

将此添加到底部:

while True:
   pass

问题是您正在运行主程序的底部。这将终止整个执行会话。

【讨论】:

  • 这是一个消耗 CPU 的无限循环。
  • 对……这只是一个简单的说明。您的反应是明显的改进。
【解决方案2】:

快速而简短的解决方案:

while True:
    time.sleep(1)

不要在 while 循环中使用 pass,因为它会占用 CPU。 无所事事的昂贵方式。

如果你想要一个更通用的解决方案,那么你可以从 threading 中导入 Tread,然后你可以使用 join:

from threading import Thread
...

p1 = Thread(name="A", target=DisplayA, args=('Display1',2))
p2 = Thread(name="B", target=DisplayB, args=('Display2',3))
p3 = Thread(name="C", target=DisplayC, args=('Display3',5))
p1.start()
p2.start()
p3.start()

p1.join()
p2.join()
p3.join()

如果线程不是无休止地运行,此解决方案也有效,并且您的程序可以在线程完成后继续。

【讨论】:

    【解决方案3】:

    您可以执行此处 Prune 建议的操作,也可以在启动 DisplayA、DisplayB 和 DisplayC 后暂停主线程。

    【讨论】:

    猜你喜欢
    • 2014-01-14
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2021-10-17
    • 2016-12-09
    • 1970-01-01
    • 2023-03-03
    • 2023-01-13
    相关资源
    最近更新 更多