Пинон vs. C

„ Програмиране с Python“, ФМИ

окиНйал ичаБиксй, фетСна енъКв, очоТ ечоТв, имиДрът имиДворт

03.06.2009

IPC

Какво е IPC?

BSD sockets

Въведение

SOCK_STREAM

Щепсели в Пайтън: клиенти

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('www.python.org', 80))
...

Щепсели в Пайтън: сървъри

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('darkstar.example.org', 1024))
sock.listen(5)
sock.accept()
...

Блокиране

Операциите върху сокети блокират по подразбиране. Може да им сложите време за прликючване (timeout), както и въобще да не чакате

Писане и четене

Основно с два метода:

Не гарантират изпращане/получване на цялото количество информация

blocking send

send(bytes, [flags])

blocking recv

recv(bufsize, [flags])

nonblocking send, recv

В неблокиращ режим, send и recv хвърлят грешка когато операцията не може да бъде изпълнена. Например може да няма достатъчно място в буфера за изпращане, или няма никакви данни в буфера за приемане.

>>> c.send(b'0'*(2*528*1024))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
socket.error: [Errno 11] Resource temporarily unavailable

EMSGSIZE

Някой протоколи комуникират чрез получаване и изпращане на съобщения. Те могат да имат изискване за максимален размер на съобщението. Ако го надвишите се хвърля socket.error(errno.EMSGSIZE)

При SOCK_STREAM комуникацията се базира на поток от данни, а не на съобщения, така че при тях това не се получава.

Съобщения

Съобщения: как?

Използвайки комуникация чрез поток от данни можем да реализираме получаване/изпращане на съобщения, използвайки някое от следните:

Съобщения: пример (API)

Изпращане (блокиращo)

outgoing_message = sockmsg.Outgoing(input().encode('utf-8'))
outgoing_message.send(some_socket)

Получаване (блокиращо)

incoming_message = sockmsg.Incoming()
print( incoming_message.recv(some_socket).decode('utf-8') )

Съобщения: пример (API)

Примерно API за съобщения

Byte-order

Marshalling

Много клиенти: реализация с нишки

По една нишка за всеки клиент. С блокиращи сокети е по-лесно.

Много клиенти: Multiplexing

Много клиенти за една нишка. Циклим между клиентите и се опитваме да правим разни неща.

Polling

Чакаме събития за писане/четене върху файловия дескриптор:

Още въпроси?

Още интересни неща на: