Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多线程:需要建议使用条件变量同步2个线程吗_Python_Multithreading_Condition Variable - Fatal编程技术网

Python多线程:需要建议使用条件变量同步2个线程吗

Python多线程:需要建议使用条件变量同步2个线程吗,python,multithreading,condition-variable,Python,Multithreading,Condition Variable,我只知道多线程的基本概念,目前我遇到了一个需要帮助的情况 我有两项任务要完成,这两项任务都应该持续执行。问题是,第二个任务应该在第一个线程首先完成一些任务之后才开始。现在,这两个线程类大致如下所示: finished = False # shared flag class first(threading.Thread): def __init__(self, cond, finished): threading.Thread.__init__(self)

我只知道多线程的基本概念,目前我遇到了一个需要帮助的情况

我有两项任务要完成,这两项任务都应该持续执行。问题是,第二个任务应该在第一个线程首先完成一些任务之后才开始。现在,这两个线程类大致如下所示:

finished = False # shared flag 

class first(threading.Thread):
    def __init__(self, cond, finished):
        threading.Thread.__init__(self)
        self.cond = cond
        self.finished = finished

    def run(self):
        self.cond.aquire()
        do_something()
        self.finished = True #change the flag
        self.cond.notify()
        self.cond.release()
        do_something_else()


class second(threading.Thread):
    def __init__(self, cond, finished):
        threading.Thread.__init__(self)
        self.cond = cond
        self.finished = finished

    def run(self):
        self.cond.aquire()
        while self.finished == False:
            self.cond.wait()
        self.cond.release()
        do_something()

然而,事实是,不管wait()和notify()如何,程序仍然随机执行。有人能帮我解决这个问题吗?谢谢。

第一类中的self.finished
是全局
finished
值的副本,不是对它的引用,因此它与第二类的
self.finished
没有实际关系


您可能应该创建一个全局
队列
对象(设计用于
线程
模块)。让两个类都引用队列,让第一个线程向队列写入前进信号,让第二个线程阻塞,直到它读取前进信号。

self。在
class first
中,finished
是全局
finished
值的副本,而不是对它的引用,因此它与
第二类的
自我完成的
没有活的关系


您可能应该创建一个全局
队列
对象(设计用于
线程
模块)。让两个类都引用队列,让第一个线程向队列写入前进信号,让第二个线程阻塞,直到它读取前进信号。

您可以完全避免同步。使用3个线程而不是2个线程

线程1a“执行一些任务”并终止。 线程1b从1a结束的位置开始,并且 线程2独立启动


(我还假设您知道,您无法有效地与Python线程共享CPU;这些线程只适用于并行等待I/O。当您需要CPU绑定的并行化时,可以使用。)

您可以完全避免同步。使用3个线程而不是2个线程

线程1a“执行一些任务”并终止。 线程1b从1a结束的位置开始,并且 线程2独立启动


(我还假设您知道,您无法有效地与Python线程共享CPU;这些线程只适用于并行等待的I/O。当您需要CPU绑定的并行化时,您可以使用。)

请在代码中演示如何使用这些类请在代码中演示如何使用这些类谢谢Russell的回答!!谢谢你的回答,拉塞尔!!