Python - 线程,时间或功能使用?

时间:2011-06-01 21:33:29

标签: java python multithreading timing

我遇到了一个关于如何解决这个问题的想法。请帮忙。

我的项目包含一个N x N网格,其中包含一系列块,这些块应该在随机方向和随机速度内移动(每隔0.1秒,块的位置用速度更新)。我有三个“特殊”块,预计会有各自的移动功能。我会有其他块(其中很多)只是更新它们的位置,并确保它们保留在网格中。

现在这三个块具有超出移动的功能,但是每个块都单独运行,等待另一个块的特殊功能完成(块2将在块1上等待,块3将等待2并将其设置回块1等等。这种排序队列将在运动发生时运行。我希望议案永不停止。在每个块的非移动功能运行n次后,代码结束。

我的问题是:我应该使用线程来启动和停止非移动功能,还是有办法设置一个时间并设置在.1秒后可以使用类函数的布尔值来连续移动对象(显然循环遍历),然后使用计数一起结束程序?如果是这样,你将如何在Python中编写main函数?对于所有这一切,有人认为Java在运行时会比Python快得多,特别是在将数据写入.txt文件时吗?

2 个答案:

答案 0 :(得分:2)

您最好的选择可能是在单个更新功能中同时处理所有这些,而不是尝试使用线程。这主要是因为Global Interpreter Lock将阻止多个线程同时处理。你之后的是这样的事情:

def tick():
  for box in randomBoxes:
    box.relocate()

  specialBlock1.relocate()

  specialBlock2.relocate()

  specialBlock3.relocate()

然后我们定义第二个函数,它将无限期地运行我们的第一个函数:

def worker():
  while True:
    tick()

    sleep(0.1)

现在我们有一个间隔或排序,我们将启动一个在后台运行的Thread并处理我们的显示更新。

from threading import Thread

t = Thread(target = worker, name = "Grid Worker")

t.daemon = True # Useful when this thread is not the main thread.

t.start()

在我们的tick()函数中,我们已经满足了specialBlocks 1,2和3按设定顺序工作的要求。其他方框各自采取行动,无论其他人做什么。

答案 1 :(得分:0)

如果您将调用特殊功能放在一个函数中,则可免费获得coordination2)。

def run(n, blocks):
    for i in range(n):
        for b in blocks:
            b.special()

至于Python与Java的速度,它取决于许多事情,例如确切的实现。信息太少,无法说出来。