相关疑难解决方法(0)

如何为stdin/stdout创建asyncio流读取器/写入器?

我需要编写两个程序,这些程序将作为父进程及其子进程运行.父进程生成子进程,然后通过连接到子进程stdin和stdout的一对管道进行通信.通信是点对点的,这就是我需要asyncio的原因.一个简单的读/回放循环是行不通的.

我写过父母.没问题,因为asyncio我提供了所需的一切create_subprocess_exec().

但是我不知道如何在孩子中创建类似的流读取器/写入器.我没想到会有任何问题.因为已经创建了管道,并且在子进程启动时可以使用文件描述符0和1.没有连接是打开的,不需要生成任何进程.

这是我不努力的尝试:

import asyncio
import sys

_DEFAULT_LIMIT = 64 * 1024

async def connect_stdin_stdout(limit=_DEFAULT_LIMIT, loop=None):
    if loop is None:
        loop = asyncio.get_event_loop()
    reader = asyncio.StreamReader(limit=limit, loop=loop)
    protocol = asyncio.StreamReaderProtocol(reader, loop=loop)
    r_transport, _ = await loop.connect_read_pipe(lambda: protocol, sys.stdin)
    w_transport, _ = await loop.connect_write_pipe(lambda: protocol, sys.stdout)
    writer = asyncio.StreamWriter(w_transport, protocol, reader, loop)
    return reader, writer
Run Code Online (Sandbox Code Playgroud)

问题是我有两个运输工具,我应该有一个.该函数失败,因为它尝试将协议的传输设置两次:

await loop.connect_read_pipe(lambda: protocol, sys.stdin)
await loop.connect_write_pipe(lambda: protocol, sys.stdout)
# !!!! assert self._transport is None, 'Transport already set'
Run Code Online (Sandbox Code Playgroud)

我试图将伪协议传递给第一行,但这行也不正确,因为需要两个传输,而不仅仅是一个:

writer = …
Run Code Online (Sandbox Code Playgroud)

python python-asyncio

11
推荐指数
1
解决办法
1781
查看次数

Python AsyncIO的loop.add_reader()期望什么文件描述符对象?

我试图了解如何在Python 3.4中使用新的AsyncIO功能,我正在努力使用event_loop.add_reader().从我发现的有限讨论看起来它看起来像是从单独的进程中读取标准而不是打开文件的内容.真的吗?如果是这样,似乎没有AsyncIO特定的方式来集成标准文件IO,这也是真的吗?

我一直在玩以下代码.以下输出给出了PermissionError: [Errno 1] Operation not permitted/python3.4/selectors.py第399行的异常self._epoll.register(key.fd, epoll_events),它由add_reader()下面的行触发

import asyncio
import urllib.parse
import sys
import pdb
import os

def fileCallback(*args):
    pdb.set_trace()

path = sys.argv[1]
loop = asyncio.get_event_loop()
#fd = os.open(path, os.O_RDONLY)
fd = open(path, 'r')
#data = fd.read()
#print(data)
#fd.close()
pdb.set_trace()
task = loop.add_reader(fd, fileCallback, fd)
loop.run_until_complete(task)
loop.close()
Run Code Online (Sandbox Code Playgroud)

编辑

对于那些寻找如何使用AsyncIO一次读取多个文件的例子,我很好奇,这里有一个如何实现它的例子.秘密就在于此yield from asyncio.sleep(0).这实际上暂停了当前函数,将其放回事件循环队列中,在执行所有其他就绪函数后调用.确定功能是根据它们的安排方式准备好的.

import asyncio

@asyncio.coroutine
def read_section(file, length):
    yield from asyncio.sleep(0)
    return file.read(length)

@asyncio.coroutine
def read_file(path):
    fd …
Run Code Online (Sandbox Code Playgroud)

python file-io python-3.4 python-asyncio

7
推荐指数
1
解决办法
4782
查看次数

使用asyncio收听按键

有人可以提供一个示例代码,这些代码示例使用asynio以非阻塞方式监听按键并在每次单击时将其放入控制台吗?

这不是一些图形工具包的问题

python python-3.x python-asyncio

7
推荐指数
3
解决办法
4743
查看次数

使用 asyncio 创建两个并发异步任务

我需要创建一个软件,它同时从 web 套接字和管道接收消息,并在另一个通道上发送消息(它从套接字接收,创建一个新线程并发送到管道。以同样的方式从管道接收,创建一个新线程并发送到套接字)。

我有一个多线程问题,在程序启动时我必须启动方法socket_receiverpipe_receiver但我只能启动pipe_receiver. 我试图消除所有的代码,并只保留socket_receiverpipe_receiver,但它只是在进入while Truepipe_receiver

import asyncio
import sys
import json
from concurrent.futures.thread import ThreadPoolExecutor
import websockets

# make the Pool of workers
executor = ThreadPoolExecutor(max_workers=10)
# Make connection to socket and pipe
header = {"Authorization": r"Basic XXXX="}
connection = websockets.connect('wss://XXXXXXXX', extra_headers=header)


async def socket_receiver():
    """Listening from web socket"""
    async with connection as web_socket:
        while True:
            message = await web_socket.recv()
            # send the message to …
Run Code Online (Sandbox Code Playgroud)

python multithreading websocket python-3.x python-asyncio

2
推荐指数
1
解决办法
2210
查看次数