Python вопрос по темам - PullRequest
       20

Python вопрос по темам

0 голосов
/ 11 февраля 2011

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

import threading

def functionA():
    for i in range(5):
        print "Calling function A"

def functionB():
    for i in range(5):
        print "Calling function B"

t1 = threading.Thread(functionA())
t2 = threading.Thread(functionB())

t1.start()
t2.start()

Результаты:

Функция вызова A Функция вызова A Функция вызова A Функция вызова A Функция вызовафункция A функция вызова B функция вызова B функция вызова B функция вызова B функция вызова B

но, к сожалению, после нескольких попыток.Я не могу получить результат

Желаемые результаты:

Функция вызова A Функция вызова B Функция вызова A Функция вызова B Функция вызова A Функция вызова B Функция вызова A Функция вызова B Функция вызова B Функция вызоваA

Может кто-нибудь подсказать мне, чтобы два потока могли работать одновременно и давать желаемые результаты.Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 11 февраля 2011

Вы вызываете функции и передаете результат конструктору Thread вместо передачи функции.Кроме того, вы должны использовать аргумент target (вместо неиспользованного group, который стоит первым).Просто используйте Thread(target=functionA) и Thread(target=functionB).Обратите внимание на отсутствие скобок после функций.

Обратите внимание, что вы все равно не получите многопоточность в CPython, но это другой вопрос.

1 голос
/ 11 февраля 2011

@ delnan уже ответил, как правильно использовать Thread, поэтому я сосредоточусь на том, что вы хотите, чтобы желаемый результат был.

Скорее всего, вы НЕ сможетеполучить желаемый результат, который вы хотите.Время выполнения потоков не гарантируется, особенно в Python.Планирование ОС может повлиять на запуск каждого потока.Когда вы запускаете два таких потока, вы фактически говорите: «эти два этапа не зависят друг от друга и могут выполняться одновременно».

Вы можете получить вывод следующим образом:

 a,a,b,b,a,a,b,b,a,b

Или:

 a,b,b,b,b,b,a,a,a,a

Он будет меняться при каждом выполнении вашей программы.НЕ полагайтесь на порядок выполнения потоков!

Потоки в Python - опасный зверь.В Python никогда не запускаются два потока одновременно.Читайте о Global Interpret Lock для получения дополнительной информации.

0 голосов
/ 11 февраля 2011

Будет замечательно, если Python 3.2 будет выпущен, так как, глядя на ссылку ниже, есть встроенные библиотеки, которые могут помочь мне достичь моих целей.

http://docs.python.org/dev/library/concurrent.futures.html

Но, тем не менее, рассмотрим альтернативу, предоставленную другими полезными членами. Спасибо за помощь, оказанную еще раз.

0 голосов
/ 11 февраля 2011

Вы пишете новый поток, операционная система заботится о том, как потоки используют процессор. Вот почему сортировка не является регулярной. Вы должны использовать другую переменную, чтобы определить, какая функция имеет поворот. Но все равно плохая идея.

...