线程不会同时 运行
Threads don't run simultaneously
我有一个简单的多线程代码,其中一些线程将项目放入队列,一些线程从队列中获取项目:
https://repl.it/@chuoi123/simpleThreading
完整代码,如果你不想访问上面的link:
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
.
这一行有问题:
t = threading.Thread(target=PutWorker(numValue),daemon = True)
您实际上是在调用 PutWorker 以将目标获取到线程。所以这一切都发生在线程实际创建之前。您应该传入函数本身。
所以像这样:
t = threading.Thread(target=PutWorker, ...
没有参数,没有调用,它只是一个函数(Thread 将调用它来启动线程)
因为它有一个参数,你需要"Curry"那个。我会这样做:
from functools import partial
...
t = threading.Thread(target=partial(PutWorker, numValue), ...
我有一个简单的多线程代码,其中一些线程将项目放入队列,一些线程从队列中获取项目: https://repl.it/@chuoi123/simpleThreading
完整代码,如果你不想访问上面的link:
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
.
这一行有问题:
t = threading.Thread(target=PutWorker(numValue),daemon = True)
您实际上是在调用 PutWorker 以将目标获取到线程。所以这一切都发生在线程实际创建之前。您应该传入函数本身。
所以像这样:
t = threading.Thread(target=PutWorker, ...
没有参数,没有调用,它只是一个函数(Thread 将调用它来启动线程)
因为它有一个参数,你需要"Curry"那个。我会这样做:
from functools import partial
...
t = threading.Thread(target=partial(PutWorker, numValue), ...