У меня есть простой многопоточный код, в котором некоторые потоки помещают элементы в очередь, а некоторые потоки получают элементы из очереди: https://repl.it/@chuoi123/simpleThreading
Полный код, если вы не хотите переходить по ссылке выше:
import threading
import queue
import time
def PutWorker(maxValue):
global item
while True:
with putLock:
if item > maxValue:
break
q.put(item)
print('Added item ' + str(item))
item += 1
time.sleep(0.5)
def GetWorker():
while True:
item = q.get()
if item is None:
break
with getLock:
print('Deleted item ' + str(item))
q.task_done()
time.sleep(1)
## main process from here
q = queue.Queue()
threads = []
putLock = threading.Lock()
getLock = threading.Lock()
item = 1
while True:
try:
numValue = int(input('Number of items in queue: '))
numThreadsGet = int(input('Number of getting threads: '))
numThreadsPut = int(input('Number of putting threads: '))
break
except:
print('Input must be ingeter.')
for i in range(numThreadsPut):
t = threading.Thread(target=PutWorker(numValue),daemon = True)
t.start()
threads.append(t)
for i in range(numThreadsGet):
t = threading.Thread(target=GetWorker,daemon = True)
t.start()
threads.append(t)
Моя проблема заключается в том, что потоки не запускаются одновременно, поэтому один тип запускается за другим в порядке их следования в коде.Результат текущего кода:
Added item 1
Added item 2
Added item 3
Added item 4
Added item 5
...
Deleted item 1
Deleted item 2
Deleted item 3
Deleted item 4
Deleted item 5
...
И я хочу получить такой результат:
Added item 1
Added item 2
Deleted item 1
Added item 3
Deleted item 2
Added item 4
Deleted item 3
Added item 5
Deleted item 4
Deleted item 5
...
Почему это произошло и что я могу сделать для архивирования своей цели?
Редактировать : после попытки решения в ответе @ user68014 я нашел другой способ - удалить параметр из def PutWorker()
и просто использовать там глобальную переменную, такую как item
.