У меня странная проблема параллелизма с Python на Cygwin.Я запускаю два потока:
- Поток, который отправляет UDP-пакеты с регулярными интервалами
- Основной поток, который ожидает KeyBoardInterrupt и, когда он получает один, он сообщает UDP-потоку об остановкеотправка через логический флаг
Это прекрасно работает в Linux (python 2.6) и Windows (Python 2.7), но имеет проблемы с Cython 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 в окне консоли.После того, как я нажму его, я получу один «отправленный пакет», но не более, пока не нажму какую-нибудь клавишу снова.В родных окнах Python и Linux я получаю «отправленный пакет» каждую секунду.
Я бы хотел использовать версию Cygwin в Windows для разработки, но я начинаю задумываться, действительно ли она работает неправильно.Я уверен, что это как-то связано с GIL?Я также попробовал версию, где флаг отправки синхронизирован с threading.RLock, но это не меняет поведение.