Проверьте, не ожидают ли какие-либо сокетные соединения (python) - PullRequest
1 голос
/ 25 февраля 2020

Я пытаюсь выполнить задачу бесконечно l oop, но я хотел бы зарезервировать возможность изменения некоторых параметров по пути, поэтому я подумал об использовании сокетов для передачи этих данных в мой код. К сожалению, чтение из файла может быть слишком медленным.

Проблема в том, что в большинстве случаев нет входящих соединений, и я не хочу блокировать код. Лучшее, что я могу придумать, это setblocking (False) и try block, но мне интересно, может ли кто-нибудь сделать это более pythoni c способом.

Извините, если это супер тривиально. Я новичок в сети.

Краткий пример того, что мне хотелось бы:

import socket
from time import sleep

HOST = '127.0.0.1'
PORT = 62800 

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server.setblocking(False)
server.bind((HOST, PORT))
server.listen()

a_parameter = 0.1
counter = 0

def task(a):
    sleep(a)

    global counter
    counter+=1
    print(counter)


while True:
    try:
        conn, addr = server.accept() # will throw an error if no connections are in the queue
        with conn:
            print('Connected by', addr)
            data = conn.recv(1024)  
            a_parameter = float(data.decode("utf-8"))
            print("New parameter:", a_parameter)
    except:
        pass

    task(a_parameter)

Вы можете попробовать это с этим клиентом:


import socket
import sys

HOST = '127.0.0.1'  # The server's hostname or IP address
PORT = 62800        # The port used by the server

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(bytes(sys.argv[1], 'utf-8'))

1 Ответ

0 голосов
/ 26 февраля 2020

В конце концов, я выбрал отдельную ветку на основе комментария пользователя 207421, так как он выглядит менее расточительным, чем try и более простым, чем asyncio . Я копирую свой код здесь на случай, если кто-то заинтересован в будущем:

from threading import Thread
import socket
from time import sleep

HOST = '127.0.0.1'
PORT = 62800 


a_parameter = 0.1
counter = 0

def socket_handler_thread_function(threadname):

    global a_parameter

    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    server.bind((HOST, PORT))
    server.listen()

    print('listening on', (HOST, PORT))

    while True:
        conn, addr = server.accept()
        with conn:
            print('Connected by', addr)
            data = conn.recv(1024)  
            a_parameter = float(data.decode("utf-8"))
            print("New parameter:", a_parameter)


def task(a):
    sleep(a)

    global counter
    counter+=1
    print(counter)

# daemon mode terminates the thread when the main code is killed 
socket_handler_thread = Thread(
        target=socket_handler_thread_function, 
        args=(1, ), 
        daemon=True
    )
socket_handler_thread.start()

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