Выбор опроса Python OS - PullRequest
       2

Выбор опроса Python OS

1 голос
/ 01 ноября 2019

Я слежу за Дэвидом Бизли Параллельность Python с нуля: LIVE! - PyCon 2015 поговорим, где я собираюсь понять основы параллелизма Python.

Я хотел бы знать, почему происходит сбой выбора Python, который используется для опроса операционной системы (ОС), и проверить, еслиесть какая-то задача, которую нужно выполнить.

from socket import *
from select import select
from collections import deque

tasks = deque()
recv_wait = {}
send_wait = {}

def fib(n):
    if n <= 2:
        return 1
    else:
        return fib(n-1)+fib(n-2)


def run():
    while any([tasks, recv_wait, send_wait]):
        while not tasks:
            can_recv, can_send, _ = select(recv_wait, send_wait, [])
            for s in can_recv:
                tasks.append(recv_wait.pop(s))
            for s in can_send:
                tasks.append(send_wait.pop(s))
        task = tasks.popleft()
        try:
            why, what = next(task)
            if why == 'recv':
                recv_wait[what] = task
            elif why == 'send':
                send_wait[what] = task
            else:
                raise RuntimeError("Arg!!")
        except StopIteration:
            print("task done")
def fib_server(address):
    sock = socket(AF_INET, SOCK_STREAM)
    sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    sock.bind(address)
    sock.listen(5)
    while True:
        yield 'recv', sock
        client, addr = sock.accept()
        print("Connection", addr)
        tasks.append(fib_handler(client))

def fib_handler(client):
    while True:
        yield 'recv', client
        req = client.recv(100)
        if not req:
            break
        n = int(req)
        result = fib(n)

        result = fib(n)
        resp = str(result).encode('ascii') + b'\n'
        yield 'send',resp
        client.send(resp)
    print("Closed")

tasks.append(fib_server(('', 25000)))
run()

# Separate terminal window
nc localhost 25000
12

# Running Python server

➜  python3 -i aserver.py
Connection ('127.0.0.1', 61098)
Traceback (most recent call last):
  File "aserver.py", line 63, in <module>
    run()
  File "aserver.py", line 20, in run
    can_recv, can_send, _ = select(recv_wait, send_wait,[])
TypeError: argument must be an int, or have a fileno() method.

1 Ответ

0 голосов
/ 05 ноября 2019
def fib_handler(client):
    while True:
        yield 'recv', client
        req = client.recv(100)
        if not req:
            break
        n = int(req)    
        result = fib(n)

        result = fib(n)  # duplicate
        resp = str(result).encode('ascii')+ b'\n'
        yield 'send',resp  # should be yielding fd (client)
        client.send(resp)
    print("Closed")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...