Python Threading + проблема блокировки сокета ввода-вывода в Cygwin

1

У меня возникла странная проблема concurrency с Python на Cygwin. Я запускаю два потока:

  • поток, который отправляет UDP-пакеты с регулярными интервалами
  • Основной поток, который ждет KeyBoardInterrupt и когда он его получает, сообщает потоку UDP о прекращении отправки через логический флаг

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

  • 0
    Вам нужен raw_input() или вы можете просто sleep() ожидании KeyboardInterrupt ?
  • 0
    Sleep (), кажется, делает свое дело. Спасибо! Хотя происходит что-то подозрительное. Что если я захочу прочитать ввод из потока A и выполнить сетевой ввод / вывод в потоке B? Тогда проблема сохраняется. Означает ли это также, что я не могу вообще блокировать ввод / вывод через несколько потоков, не сталкиваясь с этими проблемами блокировки на Cygwin?
Теги:
multithreading
sockets
cygwin

1 ответ

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню