Python Threading + проблема блокировки сокета ввода-вывода в Cygwin - PullRequest
1 голос
/ 21 июля 2010

У меня странная проблема параллелизма с 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, но это не меняет поведение.

1 Ответ

0 голосов
/ 30 марта 2011

Если вы не обновили свой cygwin (cygwin 1.5.5-1 +), я считаю, что есть некоторые ошибки в pthreads.Вы можете попробовать запустить код с последним снимком, чтобы исключить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...