Потоки не запускаются одновременно - PullRequest
0 голосов
/ 08 июня 2018

У меня есть простой многопоточный код, в котором некоторые потоки помещают элементы в очередь, а некоторые потоки получают элементы из очереди: 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.

1 Ответ

0 голосов
/ 08 июня 2018

Проблема в этой строке:

t = threading.Thread(target=PutWorker(numValue),daemon = True)

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

Так что-то вроде:

t = threading.Thread(target=PutWorker, ...

Без аргументов, без вызова, это просто функция (которую Поток вызовет для запуска потока)

Так как у него есть параметр, вам нужно ввести "Curry". Я бы сделал это так:

from functools import partial

...

t = threading.Thread(target=partial(PutWorker, numValue), ...
...