我在Cygwin上遇到了一个奇怪的并发问题。我正在运行两个线程:
这在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同步,但它不会改变行为。
答案 0 :(得分:0)
如果你还没有更新你的cygwin(cygwin 1.5.5-1 +),我相信会有一些pthreads错误。您可能希望尝试使用最新快照运行代码来排除这种情况。