线程和多处理组合[Python]

Mon*_*ory 5 python multithreading python-multiprocessing

我正在尝试使用线程和多处理模块

import multiprocessing as mp
import threading
from threading import Thread
import time

QP = mp.Queue()
Lock = mp.Lock()
Input = 100
Checked = mp.Value("i",0)

class MultiThreading(threading.Thread):
    def __init__(self,QP,Checked):
        threading.Thread.__init__(self)
        self.QP = QP
        self.Checked = Checked
    def run(self):
        global Input
        global Lock
        QueueMode = self.QP.get()
        First,Second = QueueMode
        Lock.acquire()
        print ("{} {} - Has Successfully Done".format(First,Second))
        Checked.value += 1
        time.sleep(0.25)
        Lock.release()
        if not Input == Checked.value:
            t = MultiThreading(QP,Checked)
            t.setDaemon(False)
            t.start()

def MultiCall(QP,Checked):
    for i in range(10):
        t = MultiThreading(QP,Checked)
        t.setDaemon(False)
        t.start()

if __name__ == "__main__":
    for i in range(100):
        QP.put((i,i+i))

    Processes = []
    for i in range(4):
        p = mp.Process(target=MultiCall, args=(QP,Checked))
        Processes.append(p)
        p.start()
        p.join

    while not Input == Checked:
        continue

print ("Task Done")
Run Code Online (Sandbox Code Playgroud)

上面的代码是我目前正在进行的工作,当我定期运行代码时,它会收到"无法启动新线程"或者只是冻结的错误,但是当我使用调试器https://www.onlinegdb时. com/online_python_interpreter它有效,但速度很慢,所以我对发生了什么感到困惑.

use*_*er1 1

在 MultiThreading 类中的“run”方法内部,使“if”块的条件如下

if Input > Checked.value:
Run Code Online (Sandbox Code Playgroud)

我在这里假设您希望在 Checked.value 达到输入值后停止创建进一步的线程。在以下现有条件下,可能会导致创建无限数量的线程。因为有可能某些线程的值可能超过一百,并且始终不等于 100。所以最终会创建无限数量的线程

if not Input == Checked.value:
Run Code Online (Sandbox Code Playgroud)