Код start.py как показано ниже.
import threading
class myThread(threading.Thread):
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
def run(self):
currentThreadname = threading.currentThread()
print "running in ", currentThreadname
thread = myThread(1,"mythrd")
thread.start()
Начните с python два раза.
python start.py
running in <myThread(mythrd, started 140461133485824)>
python start.py
running in <myThread(mythrd, started 140122860668672)>
Код run.py как показано ниже.
import threading
class myThread(threading.Thread):
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
def run(self):
currentThreadname = threading.currentThread()
print "running in ", currentThreadname
thread = myThread(1,"mythrd")
thread.run()
Run.py только на одну строку отличается от start.py.
Теперь запустите run.py два раза.
python run.py
running in <_MainThread(MainThread, started 139854546364160)>
python run.py
running in <_MainThread(MainThread, started 139854546364160)>
Код startandrun.py приведен ниже.
class myThread(threading.Thread):
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
def run(self):
currentThreadname = threading.currentThread()
print "running in ", currentThreadname
thread = myThread(1,"mythrd")
thread.start()
thread.run()
Теперь запустите startandrun.py два раза.
python startandrun.py
running in <myThread(mythrd, started 140317119899392)>
running in <_MainThread(MainThread, started 140317144454912)>
python startandrun.py
running in running in <_MainThread(MainThread, started 139980210505472)>
<myThread(mythrd, started 139980185949952)>
Как сказал ЙоханЛ:
При запуске двух отдельных потоков все ставки отключаются, которые будут выполняться первыми.
Вы в основном оставляете планирование операционной системе. Первый раз для запуска startandrun.py, thread.start()
был выполнен до thread.run()
, это приводит к выводу:
running in <myThread(mythrd, started 140317119899392)>
running in <_MainThread(MainThread, started 140317144454912)>
Во второй раз, чтобы выполнить startandrun.py, thread.start()
был выполнен после thread.run()
, почему бы не привести к выводу:
running in <_MainThread(MainThread, started 140317144454912)>
running in <myThread(mythrd, started 140317119899392)>
Вместо того
running in running in <_MainThread(MainThread, started 139980210505472)>
<myThread(mythrd, started 139980185949952)>
4 ответа
Это происходит из-за способа печати значений:
print "running in ", currentThreadname
Добавление запятой похоже на:
print 'running in ' # without new line at the end
print currentThreadname
И так как две функции выполняются одновременно, вот как выполняется заказ:
print 'running in ' # without new line FUNCTION #1
print 'running in ' # without new line FUNCTION #2
print currentThreadName # with new line at the end FUNCTION #1
print currentThreadName # with new line at the end FUNCTION #2
Попробуйте использовать один оператор печати без запятых, чтобы понять, как это должно быть:
def run(self):
currentThreadname = threading.currentThread()
print "running in {}".format(currentThreadname)
Это будет вести себя нормально, но поскольку две функции печатаются одновременно, вы можете получить следующий вывод:
running in <myThread(mythrd, started 10716)>running in <_MainThread(MainThread, started 12132)>
Таким образом, чтобы доказать, что это будет работать, вы можете использовать задержку между двумя вызовами, используя time.sleep()
:
import threading
import time
class myThread(threading.Thread):
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
def run(self):
currentThreadname = threading.currentThread()
print "running in {}".format(currentThreadname)
thread = myThread(1,"mythrd")
thread.start()
time.sleep(0.1)
thread.run()
Теперь вы можете видеть, что вы получаете желаемый результат, потому что каждая функция печатает один раз с задержкой в 0,1 секунды между вызовами:
running in <myThread(mythrd, started 5600)>
running in <_MainThread(MainThread, started 7716)>
РЕДАКТИРОВАТЬ:
Ваша проблема именно в том, почему вы должны использовать многопоточность вместо того, чтобы запускать один и тот же поток дважды. Когда вы используете многопоточность , вы можете использовать thread.join()
, который будет ждать завершения потока, а затем продолжить код, или вы можете использовать threading.lock()
, чтобы продолжить свой код, но заблокировать функцию, которая будет использоваться одним потоком за раз. Вот некоторые примеры:
< Сильный > Thread.join ( ) :
thread = myThread(1, "mythrd")
thread2 = myThread(2, "thrd2")
thread.start()
thread.join() # code will stop here and wait for thread to finish then continue
thread2.run()
< Сильный > threading.lock ( ) :
....
def run(self):
with lock: # if one thread uses this lock the other threads have to wait
currentThreadname = threading.currentThread()
print "running in ", currentThreadname
thread = myThread(1, "mythrd")
thread2 = myThread(2, "thrd2")
lock = threading.Lock()
thread.start()
thread2.run()
# code keeps running even if there are threads waiting for the lock
Итак, все, что вы хотите, это синхронизировать ваши темы. Это можно легко сделать, используя функцию join () в библиотеке потоков.
Вы можете сделать что-то вроде этого
class myThread(threading.Thread):
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
def run(self):
currentThreadname = threading.currentThread()
print "running in ", currentThreadname
thread = myThread(1,"mythrd")
t1 = thread.start()
t1.join()
t2 = thread.run()
t2.join()
Вы также можете использовать семафор и блокировку для более веских причин. Смотрите документы для более подробной информации.
Какую версию Python вы использовали? В python 2 «print» не является поточно-ориентированным. См. http: // tech.queryhome.com/54593/is-print-thread-safe-in-python-2-6-2-7.
Если потоки переключаются во время «печати», выходы смешиваются, как вы видели.
Вероятно, вы не понимаете, как работают потоки. Внимательно прочитайте этот.
Я настоятельно рекомендую вам использовать ThreadPoolExecutor
из библиотеки futures
.
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.