V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  1462326016  ›  全部回复第 8 页 / 共 9 页
回复总数  170
1  2  3  4  5  6  7  8  9  
@gravitykey 可能是因为生产者不停持有锁造成的问题,详见附言,感谢回复。
@lllllliu 哈哈,谢谢,顺便给大家留一个参考
@rogwan 应该是 windows 和 linux 的多进程实现方式不同造成的,由于我忘了加 sleep,导致不停地在获取队列大小,造成一直持有锁,所以会很慢。linux 可能进程是 fork 出来的,所以加锁方式不同或者其他原因?个人看法,未求证!
@skinny 已经找到原因了,详见附言,感谢帮助。
@BingoXuan 生产者只需保证队列中的数据达到 10000 条就不会再生产了,这时候只剩下消费者不停地 get 数据
@skinny put 元素的速度是很快的,你可以看 size 线程的输出值,几秒钟就可以生成 10000 条数据,并且在数据不足 10000 的时候再次生成数据 put 进去。所以说无论是否 time.sleep(2),都可以保证 get 的时候队列中数据是大于 10000 的
@BingoXuan 所以说我觉得可能是 windows 平台实现方式不一样导致的?但是我记得我之前也这么用过,是没有问题的。。。。
@lllllliu 只记录了 queue 的 get 方法的耗时,所以应该就是在 get 的时候比较耗时,但是单条数据会很快,数据多了就很慢,很难 debug。。。
2019-08-14 14:17:19 +08:00
回复了 1462326016 创建的主题 Python 关于 asyncio 创建多个 tcp 连接,线程数不准确的问题
@gaokevin163 恩恩,这个我是了解的,可以通过自己新开线程然后在新的线程中新建事件循环达到多个线程处理 io 的目的。发帖子的目的主要就是弄清楚其他线程是干什么用的。
2019-08-14 09:39:24 +08:00
回复了 1462326016 创建的主题 Python 关于 asyncio 创建多个 tcp 连接,线程数不准确的问题
@cs010 非常感谢, 回答正确, 我试了下的确就是我想要的结果,感谢感谢!我去翻翻源码看看怎么实现的。
2019-08-14 09:21:21 +08:00
回复了 1462326016 创建的主题 Python 关于 asyncio 创建多个 tcp 连接,线程数不准确的问题
@BBCCBB 感谢回复,我在获取线程数量下方添加了 currentThread 函数,获取到的对象都是同一个 Thread 对象,证实了当前的十个连接都是在同一个线程上的。但是为什么单单在打开 tcp 连接的时候出现这么多线程呢?如果不打开 tcp 连接,只是把 task 函数 sleep 模拟下任务的话就只有一个主线程是活动的,线程数量总是 1。
2019-08-14 08:47:07 +08:00
回复了 1462326016 创建的主题 Python 关于 asyncio 创建多个 tcp 连接,线程数不准确的问题
@BBCCBB 可是我要获取的是当前线程总数量,为什么要用 currentThread 呢?
2019-08-09 10:45:58 +08:00
回复了 joson1205 创建的主题 Python Python 读取 Excel 超大数据文件问题
试试 openpyxl ?
2019-07-25 22:49:34 +08:00
回复了 peanuts7660 创建的主题 Python 有什么方法能批量将 py 文件 生成 pyd 文件吗?
2019-07-18 15:20:20 +08:00
回复了 piaochen0 创建的主题 Python 爬虫如何处理弹框式的登录?
图挂了。。。弹窗无非就是 ajax 请求,然后认证完给你 cookie,找到登录按钮的请求就搞定了。
2019-07-15 20:07:15 +08:00
回复了 peanuts7660 创建的主题 Python 请教下 Python 在 windows 上执行命令行的问题
理论上来说你这样的话 B 就是 A 的子进程了,除非 B 退出了,否则你这种情况下应该不能单独退出 A 让 B 单独运行。
啊,格式乱了,不知道怎么格式化成 markdown。。。无语。
感谢大家的帮助,改成全双工已经没有问题了。
```
# -*- coding: utf-8 -*-
import asyncio
from struct import unpack, pack


async def handle_echo(reader, writer):
data = await reader.read(1024 * 64)
addr = writer.get_extra_info('peername')
print(f"connect from {addr!r}")
if len(data) < 3:
print('too short...')
writer.close()
return
result = unpack('!BBB', data[:3])
writer.write(b'\x05\x00')
await writer.drain()
data = await reader.read(1024 * 64)
result = unpack('!4B', data[:4])
if result[0] == 5 and result[1] == 1 and result[3] == 3:
host_len = unpack('!B', data[4:5])[0]
host = data[5:host_len + 5].decode()
port = unpack('!H', data[host_len + 5:])[0]
print(f'len {host_len},host {host},port {port}')
try:
reader_remote, writer_remote = await asyncio.open_connection(host, port)
writer.write(pack('!5B', 5, 0, 0, 3, host_len) + host.encode() + pack('!H', port))
await writer.drain()
print(f'connect success !{host}')
except (TimeoutError, ConnectionRefusedError) as _:
print(f'connect failed !{host}')
writer.write(pack('!5B', 5, 3, 0, 3, host_len) + host.encode() + pack('!H', port))
await writer.drain()
writer.close()
return
up_stream = _pipe(reader, writer_remote, host)
down_stream = _pipe(reader_remote, writer, host)
await asyncio.gather(up_stream, down_stream)
if result[0] == 5 and result[1] == 1 and result[3] == 1:
ip = '.'.join([str(a) for a in unpack('!BBBB', data[4:8])])
port = unpack('H', data[8:10])[0]
print(f'ip {ip},port {port}')
try:
reader_remote, writer_remote = await asyncio.open_connection(ip, port)
writer.write(pack('!8B', 5, 0, 0, 1, *unpack('!BBBB', data[4:8])) + pack('!H', port))
await writer.drain()
print(f'connect success !{ip}')
except (TimeoutError, ConnectionRefusedError) as _:
print(f'connect failed !{ip},{repr(_)}')
writer.write(pack('!8B', 5, 3, 0, 1, *unpack('!BBBB', data[4:8])) + pack('!H', port))
await writer.drain()
writer.close()
return
up_stream = _pipe(reader, writer_remote, ip)
down_stream = _pipe(reader_remote, writer, ip)
await asyncio.gather(up_stream, down_stream)


async def _pipe(reader, writer, host):
while reader.at_eof:
try:
data = await reader.read(1024 * 64)
if not data:
writer.close()
break
except (ConnectionAbortedError, ConnectionResetError) as _:
writer.close()
print(f'{host} 异常退出 {repr(_)}')
break
try:
writer.write(data)
await writer.drain()
except (ConnectionAbortedError, ConnectionResetError) as _:
writer.close()
print(f'{host} 异常退出 {repr(_)}')
break
print(f'{host} 退出')


async def main():
server = await asyncio.start_server(
handle_echo, '0.0.0.0', 3333)

addr = server.sockets[0].getsockname()
print(f'Serving on {addr}')

async with server:
await server.serve_forever()


loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(main()))

```
代码在此
2019-06-28 11:53:49 +08:00
回复了 woshichuanqilz 创建的主题 Python 求助 pywintypes.com_error: (-2147221005, '无效的类字符串'... 问题
@woshichuanqilz 我直接百度了一个,SAPI.SpVoice 以这个为关键字搜索的一个 zip 文件,然后注册了直接就可以调用了
1  2  3  4  5  6  7  8  9  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2836 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 22ms · UTC 15:09 · PVG 23:09 · LAX 08:09 · JFK 11:09
Developed with CodeLauncher
♥ Do have faith in what you're doing.