Python-线程正在同时打印,弄乱了文本输出 [英] Python - Threads are printing at the same time messing up the text output

查看:790
本文介绍了Python-线程正在同时打印,弄乱了文本输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在应用程序中使用4个线程,这些线程返回我要打印给用户的文本. 由于我想避免线程独立地打印这些文本,因此我创建了一个类来对其进行管理...

I am using 4 threads in an application which return text I would like to print to the user. Since I would like to avoid the threads to independently print those texts, I have created a class to administrate it...

我不知道我在做什么错,但仍然无法正常工作.

I don't know what I am doing wrong here, but it is still not working.

您可以在下面看到的代码:

The code you can see below:

from threading import Thread
import time
import random

class Creature:

    def __init__(self, name, melee, shielding, health, mana):
        self.name = name
        self.melee = melee
        self.shielding = shielding
        self.health = health
        self.mana = mana

    def attack(self, attacker, opponent, echo):
        while 0 != 1:
            time.sleep(1)
            power = random.randint(1, attacker.melee)
            resistance = random.randint(1, opponent.shielding)
            resultant = power - resistance
            if resistance > 0:
                opponent.health -= resistance
                if opponent.health < 0:
                    msg = opponent.name, " is dead"
                    echo.message(msg)
                    quit()
                else:
                    msg = opponent.name, " lost ", resistance, " hit points due to an attack by ", attacker.name
                    echo.message(msg)

    def healing(self, healed, echo):
        while 0 != 1:
            time.sleep(1)
            if self.mana >= 25:
                if healed.health >= 0:
                    if healed.health < 50:
                        life = random.randint(1, 50)
                        self.mana -= 25
                        healed.health += life
                        if healed.health > 100:
                            healed.health = 100
                        msg = healed.name, " has generated himself and now has ", self.health, " hit points"
                        echo.message(msg)
                else:
                    quit()

class echo:
    def message(self, msg):
        print msg

myEcho = echo()

Monster = Creature("Wasp", 30, 15, 100, 100)
Player = Creature("Knight", 25, 20, 100, 100)

t1 = Thread(target = Player.attack, args = (Monster, Player, myEcho))
t1.start()
t2 = Thread(target = Monster.attack, args = (Player, Monster, myEcho))
t2.start()
t3 = Thread(target=Player.healing(Player, myEcho), args=())
t3.start()
t4 = Thread(target=Monster.healing(Monster, myEcho), args=())
t4.start()

在这里您可以看到混乱的输出:

Here you can see the messed up outputs:

*('Wasp'('Knight', ' l, ' lost ', ost 13, ' hit points ', 4, due to an attack by '' hi, 'Waspt poi')nts d
ue to an attack by ', 'Knight')
('Wasp', ' lost ', 12, ' hit points due to an attack by ', 'Knight')
('Knight', ' lost ', 17, ' hit points due to an attack by ', 'Wasp')
('Wasp', ' lost ', 6, ' hit points due to an attack by ', 'Knight'('Knight')
, ' lost ', 1, ' hit points due to an attack by ', 'Wasp')
('Wasp', ' lost ', 5, ' hit points due to an attack by ', 'Knight')
('Knight', ' lost ', 13, ' hit points due to an attack by ', 'Wasp')
(('Wa'Knighsp't', , ' los' lostt ' ', , 32, ' hit points due to an attack by ', 'Knight')
, ' hit points due to an attack by ', 'Wasp')*

你们知道如何解决此问题吗?

Do you guys have any idea how to fix this issue?

谢谢!

推荐答案

使用

Use a threading.Semaphore to ensure that there won't be any conflicts:

screenlock = Semaphore(value=1)   # You'll need to add this to the import statement.

然后,在调用echo.message之前,插入以下行以获取输出权限:

Then, before you call echo.message, insert this line in order to acquire the right to output:

screenlock.acquire()

,然后在此行 之后调用echo.message,以便允许另一个线程打印:

and then this line after you call echo.message so as to allow another thread to print:

screenlock.release()

这篇关于Python-线程正在同时打印,弄乱了文本输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆