线程不会同时运行

2024-09-29 17:14:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的多线程代码,其中一些线程将项目放入队列,一些线程从队列中获取项目: 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。你知道吗


Tags: 代码importtrueaddedtimequeuedefitem
1条回答
网友
1楼 · 发布于 2024-09-29 17:14:45

这条线有问题:

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

实际上,您正在调用PutWorker以使目标进入线程。所以这一切都发生在线程实际创建之前。您应该传入函数本身。你知道吗

比如:

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

没有参数,没有调用,它只是一个函数(哪个线程将调用它来启动线程)

因为它有一个参数,所以您需要在其中“Curry”。我会这样做:

from functools import partial

。。。你知道吗

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

相关问题 更多 >

    热门问题