gpt4 book ai didi

Python 等价于 Java 的函数 wait(), notify(), synchronized

转载 作者:太空狗 更新时间:2023-10-30 01:15:15 25 4
gpt4 key购买 nike

我必须用 Python 2.7 编写一个类,但遇到了一些问题。我来自 java 背景,最近学习了 python

如果我必须用 java 做的话,这是我会写的

public class CommandSender extends Thread {
private boolean isTimeOut;
private boolean running;
private ArrayList<Command> waitingList;

public CommandSender() {
running = false;
waitingList = new LinkedList<Command>();
isTimeOut = false;
}

public void run() {
running = true;
while (running) {
synchronized (this) {
while (waitingList.isEmpty() && running) {
try {
wait();
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
while (!waitingList.isEmpty() && running) {
currentCmd = waitingList.remove(0);
// doSomething(currentCmd)
}
}
}
}

public synchronized void sendCommand(Command cmd) {
waitingList.add(cmd);
notify();
}

public synchronized boolean isTimeOut() {
return isTimeOut;
}
}

我现在在做什么

class CommandSender(threading.Thread)

def __init__(self):
threading.Thread.__init__(self)
self.waiting_list = []
self.running = False
self.is-time_out = False
self.my_lock = threading.Lock()

def run(self):
self.running = True
with self.my_lock:
while len(self.waiting_list) == 0 and self.running:
# Don't know what I have to do here
while len(self.waiting_list) != 0 and self.running:
# Do my stuff

def send_command(self, cmd):
with self.my_lock:
self.waiting_list.append(cmd)
# Notify ?

def is_time_out(self):
with self.my_lock:
return self.is_rime_out

我对每个实例使用一把锁,因为只有一个 CommandSender 实例

那么如何进行等待/通知过程呢?我的同步块(synchronized block)使用得好吗?

谢谢!

最佳答案

首先,你应该知道Python的global interpreter lock将不允许多个线程同时运行 Python 代码(尽管线程可以运行例如 C 代码,例如,如果它们适本地释放 GIL,则使用 native 代码模块)。如果您需要通过 Python 代码使用多核 CPU,请查看 multiprocessing模块。

现在,直接等价于 threading.Event类(class)。创建一个 Event 对象,然后使用 waitset

关于Python 等价于 Java 的函数 wait(), notify(), synchronized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23127660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com