从线程类调用时,Python函数表现不如预期
我正在用新的Minecraft Pi Edition API为Python 2.7写一个游戏。游戏快完成的时候,我发现代码的两个部分互相干扰。如果我先写部分A,部分B就没法运行,直到部分A完成。如果我先写部分B,它就会运行得很慢。我决定把这两个部分分成两个独立的线程。
这是一个简化版的代码,仍然存在这个问题。我注意到如果我把其中一个类的ClassName.start()
这一行注释掉,另一个类就能正常运行了。
import mcpi.minecraft as minecraft
import threading
mc = minecraft.Minecraft.create()
class BlockCheckThread(threading.Thread):
def run(self):
while True:
event = mc.events.pollBlockHits()
class WinningCheckThread(threading.Thread):
def run(self):
while True:
blockTest = mc.getBlock(1, 1, 1,) == 50
def main():
WinningCheckThread().start() # If I comment out either of these .start() lines
BlockCheckThread().start() # the other class executes perfectly.
运行这个代码时出现的错误如下:
Exception in thread Thread-2:
...
TypeError: Hit() takes exactly 5 arguments (1 given)
Exception in thread Thread-1:
...
ValueError: invalid literal for int() with base 10: '
要运行这个代码,你需要一台树莓派,并且需要从这里下载Minecraft。然后你必须从api/python/
目录运行它。(也就是说,它必须和你要导入的mcpi
模块在同一个文件夹里。)
这是我第一次尝试使用线程,所以别太嘲笑我的代码。我想知道为什么这段代码不工作,以及我该怎么修复它。
2 个回答
4
你正在共享一个
import mcpi.minecraft as minecraft
import threading
class BlockCheckThread(threading.Thread):
def run(self):
mc = minecraft.Minecraft.create()
while True:
event = mc.events.pollBlockHits()
class WinningCheckThread(threading.Thread):
def run(self):
mc = minecraft.Minecraft.create()
while True:
blockTest = mc.getBlock(1, 1, 1,) == 50
def main():
WinningCheckThread().start()
BlockCheckThread().start()