Python - Threading, Timing или использование функции? - PullRequest
4 голосов
/ 02 июня 2011

У меня проблема с формулировкой идеи о том, как решить эту проблему.Пожалуйста помоги.

Мой проект состоит из сетки N x N с серией блоков, которые должны двигаться в случайном направлении и со случайной скоростью в пределах этой сетки (каждые 0,1 секунды местоположение блока обновляется с помощьюскорость).У меня есть три «специальных» блока, которые, как ожидается, будут иметь индивидуальные функции движения.У меня будут другие блоки (многие из них), которые будут делать только обновление своего местоположения и следить за тем, чтобы они оставались в сетке.

Теперь у этих трех блоков есть функции вне движения, но каждый из них работает индивидуально, ожидаязавершение специальной функции другого блока (блок 2 будет ожидать блока 1, блок 3 будет ждать 2 и снова установить его в блок 1 и т. д.) Эта очередь будет работать, пока происходит движение.Я хочу, чтобы движение никогда не прекращалось.После того, как функция каждого блока выполняется n раз, код завершается.

Мой вопрос таков: использовать ли потоки для запуска и остановки функций без движения, или есть способ просто установить времяи установить логические значения, которые могли бы использовать функцию класса через 0,1 секунды, чтобы непрерывно перемещать объекты (и, очевидно, повторять цикл снова и снова), а затем использовать счетчики, чтобы завершить программу все вместе?Если так, как бы вы написали основную функцию для этого в Python?При всем этом, кто-нибудь думает, что Java будет работать значительно быстрее, чем Python, особенно если записывать данные в файл .txt?

Ответы [ 2 ]

2 голосов
/ 02 июня 2011

Лучше всего, вероятно, обрабатывать их все одновременно в одной функции обновления, а не пытаться использовать потоки. Это связано прежде всего с тем, что глобальная блокировка интерпретатора будет препятствовать одновременной обработке нескольких потоков. То, что вы после этого, выглядит примерно так:

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

  specialBlock1.relocate()

  specialBlock2.relocate()

  specialBlock3.relocate()

Затем мы определяем вторую функцию, которая будет бесконечно запускать нашу первую функцию:

def worker():
  while True:
    tick()

    sleep(0.1)

Теперь, когда у нас есть интервал или сортировки, мы запустим поток, который работает в фоновом режиме и обрабатывает наши обновления дисплея.

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() мы работали с требованиями, чтобы спецблоки 1, 2 и 3 работали в установленном порядке. Все остальные блоки выполняют свои действия независимо от того, что делают другие.

0 голосов
/ 02 июня 2011

Если вы объедините вызовы специальных функций в одну функцию, вы получите координацию ( 2 ) бесплатно.скорость Python по сравнению с Java, это зависит от многих вещей, таких как точная реализация.Слишком мало информации, чтобы сказать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...