Я пишу программу, которая использует TCP IP для отправки / получения данных. Чтобы ускорить синтаксический анализ и анализ данных, я в настоящее время использую всюду представление о памяти исходного пакета и похоже, что он работает. Но безопасно ли это? Могут ли байты, указанные в изменении вида памяти, быть удалены сборщиком мусора?
Я пытался найти ответ в Google, Duckduck go, Python документы, стек переполнение , но ни один из них имел любой.
Пример кода:
from socket import socket
def _receive(conn: socket) -> (int, bytes):
"""
Read whole packet from connection.
:returns length of packet, read bytes
:rtype int, bytes
"""
packet_length = self.__read_packet_length()
fragments = []
read_bytes = 0
while read_bytes < packet_length:
packet = conn.recv(packet_length - read_bytes)
if not packet:
return None
fragments.append(packet)
read_bytes += len(packet)
return packet_length, b''.join(fragments)
def recv(conn: socket) -> memoryview:
packet_len, data = _receive
# do_stuff
return memoryview(data)
При написании этого поста у меня возникла идея передать buffer в функцию и записать в нее данные, но я думаю, это все еще хороший вопрос.