У меня возникла странная проблема concurrency с Python на Cygwin. Я запускаю два потока:
Это отлично работает под Linux (python 2.6) и Windows (Python 2.7), но имеет проблемы с Cygwin Python (2.6).
В Cygwin поток отправки сокетов ждет, пока основной поток не получит какой-либо вход (raw_input) от пользователя, прежде чем он отправит UDP-пакет. Это происходит каждый раз. Вот код:
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 я получаю "отправленный пакет" каждую секунду.
Я хотел бы использовать версию Cygwin в Windows для разработки, но я начинаю задаваться вопросом, действительно ли она работает неправильно. Я спрашиваю, как это связано с GIL? Я также попробовал версию, где флаг отправки синхронизирован с threading.RLock, но он не изменяет поведение.
Если вы не обновили свой cygwin (cygwin 1.5.5-1 +), есть некоторые ошибки pthreads, которые я считаю. Возможно, вы захотите попробовать запустить код с последним снимком, чтобы это исключить.
raw_input()
или вы можете простоsleep()
ожиданииKeyboardInterrupt
?