【发布时间】:2013-11-14 19:44:20
【问题描述】:
我正在尝试编写一个程序,我希望使用它在两个线程之间交替,线程1 和线程2。棘手的部分是线程应该首先开始执行必须是thread1。 这是我到目前为止的代码:
Class Client:
#member variables
def sendFile(self,cv1,lock1):
sent=0;
while (i<self.size):
message = self.data[i:1024+i]
cv1.acquire()
BadNet.transmit(self.clientSocket,message,self.serverIP,self.serverPort)
cv1.notify()
cv1.release()
i = i+1024
sent+=1
lock1.wait()
print "File sent successfully !"
self.clientSocket.close()
def receiveAck(self,cv1,lock2):
i=0
while (1):
lock1.clear()
cv1.acquire()
cv1.wait()
print "\nentered ack !\n"
self.ack, serverAddress = self.clientSocket.recvfrom(self.buf)
cv1.release()
lock1.set()
if __name__ == "__main__":
lock1 = Event()
cv1 = Condition()
cv2= Condition()
client = Client();
client.readFile();
thread1 = Thread(target = client.sendFile, args=[cv1,lock1])
thread2 = Thread(target = client.receiveAck, args=[cv1,lock1])
thread1.start()
thread2.start()
thread1.join()
thread2.join()
我目前面临的问题是,最初程序确实在两个线程之间交替(由控制台上的输出确认。但是在任意数量的迭代(通常在 20 到 80 之间)之后,程序只是挂起并且没有进一步的迭代被执行。
【问题讨论】:
-
我的第一个问题是,你为什么要这个?如果两个线程只是显式地交换控制权,那么拥有两个线程有什么意义呢?使用生成器可以更轻松地做到这一点?
-
为了便于理解,我只是简化了我的程序。实际上发生的事情是 thread1 使用 UDP 套接字发送数据包,而 thread2 使用相同的套接字接收该数据包的确认。除非已收到对先前数据包的确认,否则不应继续执行 Thread1。我希望你明白我的意思,但即使你不明白,我也会要求你忽略我在两个线程之间交替的目的,并帮助解决我面临的问题。
-
听起来相当顺序...为什么要使用线程而不是简单地使用阻塞 IO?阻塞,直到你得到你的 ACK,然后在循环中移动到下一个数据包,为什么是线程?
-
一个明显的问题是您没有在服务员端使用条件。您必须循环检查条件并在
acquire/release对中调用cv1.wait(),或者您只是将 cv 用作损坏的事件+锁定组合。更重要的是,您首先看不到有任何条件可以使用 cv 进行保护。例如,如果套接字是非阻塞的,并且您检查了recvfrom没有准备好,那将是用 cv 保护的东西,但您没有这样做。 -
另外,给我们一个可以调试的完全运行的例子(SSCCE)会让事情变得更容易;与其猜测代码中可能有什么问题,我们可以弄清楚是什么错误。
标签: python multithreading events synchronization