Cygwin中的Python线程+套接字IO锁定问题

时间:2010-07-21 07:18:54

标签: python multithreading sockets cygwin

我在Cygwin上遇到了一个奇怪的并发问题。我正在运行两个线程:

  • 定期发送UDP数据包的线程
  • 等待KeyBoardInterrupt的主线程,当它收到一个主线程时,它告诉UDP线程停止通过布尔标志发送

这在Linux(python 2.6)和Windows(Python 2.7)下工作正常,但是Cygwin的Python(2.6)存在问题。

在Cygwin中,套接字发送线程等待主线程在发送UDP数据包之前从用户获得任何输入(raw_input)。每次都会发生这种情况这是代码:

import sys
import socket
import threading
from time import sleep

class UdpPacketSender(threading.Thread):
    def __init__(self, address, port):
        threading.Thread.__init__ (self)
        self.address = (address, int(port))
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.send = True

    def run(self):
        while self.send:
            print "Sending packet..."
            self.socket.sendto("Hello", self.address)
            print "sent packet"
            sleep(1)
        self.socket.close()

    def stop_sending(self):
        self.send = False

sender = UdpPacketSender("127.0.0.1", 7000)
sender.start()
try:
    while True:
        raw_input()
except KeyboardInterrupt:
    print "Got keyboard interrupt, stopping"
    sender.stop_sending()

所以在Cygwin下我从来没有得到打印输出“发送数据包”,直到我按控制台窗口上的Enter键。在我按下之后,我得到一个“已发送的数据包”,但在我再次按某个键之前不再有。在本机Windows Python和Linux中,我每秒都会收到“发送数据包”。

我想在Windows中使用Cygwin版本进行开发,但我开始怀疑它是否真的不能正常工作。我认为这与GIL有关吗?我还尝试了一个版本,其中send-flag与threading.RLock同步,但它不会改变行为。

1 个答案:

答案 0 :(得分:0)

如果你还没有更新你的cygwin(cygwin 1.5.5-1 +),我相信会有一些pthreads错误。您可能希望尝试使用最新快照运行代码来排除这种情况。