powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Сокеты: не получается обрабатывать входящие соединения
3 сообщений из 3, страница 1 из 1
Сокеты: не получается обрабатывать входящие соединения
    #39647646
server.py
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
#!/usr/bin/env python
import sys
from multiprocessing import Process, Queue
from multiprocessing.connection import Listener
from queue import Empty
from time import sleep


class Worker(Process):
  def __init__(self, q):
    super().__init__(daemon=True)
    self.q = q
    print('start process')
    sys.stdout.flush()
    self.start()

  def run(self):
    while 1:
      try:
        client = self.q.get()
        try:
          data = client.recv_bytes()
        except EOFError:
          # Соединение разорвано клиентом
          print('connection is lost')
          sys.stdout.flush()
          continue
        print('received: {}'.format(data.decode()))
        sys.stdout.flush()
        client.send_bytes(b'OK')
        # Добавляем клиентское соединение в конец очереди
        self.q.put(client)
      except Empty:
        print('queue is empty')
        sys.stdout.flush()
        # sleep добавлен только чтобы ограничить скорость вывода в консоль
        sleep(1)


if __name__ == '__main__':
  listener = Listener(('localhost', 9000), authkey=b'secret')
  q = Queue()
  # У нас будет 10 процессов для работы с клиентскими соединениями
  print('start worker processes')
  for i in range(10):
    Worker(q)
  print('start server')
  while 1:
    client = listener.accept()
    print('client:', client)
    q.put(client)



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
$ ./server.py
start worker processes
start process
start process
start process
start process
start process
start process
start process
start process
start process
start process
start server
client: <multiprocessing.connection.Connection object at 0x7f9a41bcce80>
client: <multiprocessing.connection.Connection object at 0x7f9a41bd17f0>
client: <multiprocessing.connection.Connection object at 0x7f9a41bd1710>
client: <multiprocessing.connection.Connection object at 0x7f9a41bd1748>
client: <multiprocessing.connection.Connection object at 0x7f9a41bcce80>
connection is lost
connection is lost
connection is lost
connection is lost
connection is lost
client: <multiprocessing.connection.Connection object at 0x7f9a41bdf198>
client: <multiprocessing.connection.Connection object at 0x7f9a41bcce80>
client: <multiprocessing.connection.Connection object at 0x7f9a41bdf198>
connection is lost
connection is lost
connection is lost
client: <multiprocessing.connection.Connection object at 0x7f9a41bd1748>
connection is lost



Это вообще виснет и ничего не выводит

test.py
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#!/usr/bin/env python
import sys
from multiprocessing import Pool
from multiprocessing.connection import Client


def test_client(i):
  client = Client(('localhost', 9000), authkey=b'secret')
  client.send_bytes(b'hello from client #{}'.format(i))
  data = client.recv_bytes()
  print('client #{} received:', data.decode())
  sys.stdout.flush()


if __name__ == '__main__':
  p = Pool()
  for i in range(10):
    p.apply_async(test_client, (i, ))
  p.close()
  p.join()
...
Рейтинг: 0 / 0
Сокеты: не получается обрабатывать входящие соединения
    #39647690
Патриот Израиля,

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
#!/usr/bin/env python
import traceback
from multiprocessing import Process
from multiprocessing.connection import Listener


class Worker(Process):
  def __init__(self, conn):
    super().__init__()
    self.daemon=True
    self.conn = conn

  def run(self):
    while 1:
      try:
        data = self.conn.recv()
      except Exception:
        traceback.print_exc()
        break
      print('received:', data)
      self.conn.send('OK')


if __name__ == '__main__':
  listener = Listener(('localhost', 9000), authkey=b'secret')
  while 1:
    try:
      conn = listener.accept()
      Worker(conn).start()
    except Exception:
      traceback.print_exc()



Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#!/usr/bin/env python
from multiprocessing import Pool
from multiprocessing.connection import Client


def test_client(i):
  conn = Client(('localhost', 9000), authkey=b'secret')
  conn.send('hello from client #{}'.format(i))
  data = conn.recv()
  return (i, data)


if __name__ == '__main__':
  # for i in range(10):
  #   conn = Client(('localhost', 9000), authkey=b'secret')
  #   conn.send('hello from client #{}'.format(i))
  #   data = conn.recv()
  #   print(i, data)
  p = Pool()
  results = p.map(test_client, range(10))
  print(results)
  p.close()
  p.join()



Вывод сервера:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
$ ./server.py
received: hello from client #1
received: hello from client #2
received: hello from client #0
connection closed
connection closed
connection closed
received: hello from client #8
connection closed
received: hello from client #9
connection closed
received: hello from client #4
received: hello from client #3
received: hello from client #6
connection closed
connection closed
connection closed
received: hello from client #7
connection closed
^CTraceback (most recent call last):
  File "./server.py", line 26, in <module>
    conn = listener.accept()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 453, in accept
    c = self._listener.accept()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 593, in accept
    s, self._last_accepted = self._socket.accept()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/socket.py", line 205, in accept
    fd, addr = self._accept()
KeyboardInterrupt
(py3) sergey@sergey-Lenovo-Y520-15IKBN:~/code/threads_and_processes/multiprocessing_server$ ./server.py
received: hello from client #1
received: hello from client #0
connection closed
connection closed
received: hello from client #2
connection closed
received: hello from client #8
received: hello from client #9
connection closed
connection closed
received: hello from client #6
connection closed
received: hello from client #5
connection closed
^CTraceback (most recent call last):
  File "./server.py", line 26, in <module>
    try:
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 453, in accept
    c = self._listener.accept()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 593, in accept
    s, self._last_accepted = self._socket.accept()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/socket.py", line 205, in accept
    fd, addr = self._accept()
KeyboardInterrupt
(py3) sergey@sergey-Lenovo-Y520-15IKBN:~/code/threads_and_processes/multiprocessing_server$ ./server.py
received: hello from client #0
received: hello from client #2
received: hello from client #1
Traceback (most recent call last):
Traceback (most recent call last):
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
Traceback (most recent call last):
EOFError
EOFError
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
EOFError
received: hello from client #9
received: hello from client #8
Traceback (most recent call last):
Traceback (most recent call last):
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
EOFError
EOFError
received: hello from client #3
Traceback (most recent call last):
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
EOFError
received: hello from client #4
Traceback (most recent call last):
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
EOFError
received: hello from client #6
received: hello from client #7
Traceback (most recent call last):
Traceback (most recent call last):
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
EOFError
EOFError
received: hello from client #5
Traceback (most recent call last):
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
EOFError
received: hello from client #2
received: hello from client #0
received: hello from client #1
Traceback (most recent call last):
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
EOFError
Traceback (most recent call last):
Traceback (most recent call last):
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
EOFError
EOFError
received: hello from client #8
received: hello from client #9
Traceback (most recent call last):
Traceback (most recent call last):
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
EOFError
EOFError
received: hello from client #4
Traceback (most recent call last):
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
EOFError
received: hello from client #5
Traceback (most recent call last):
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
EOFError
received: hello from client #6
Traceback (most recent call last):
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
EOFError
received: hello from client #7
Traceback (most recent call last):
  File "./server.py", line 16, in run
    data = self.conn.recv()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/sergey/.pyenv/versions/3.6.5/lib/python3.6/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
EOFError



Только раз сработало нормально:
Код: php
1.
2.
$ ./test.py
[(0, 'OK'), (1, 'OK'), (2, 'OK'), (3, 'OK'), (4, 'OK'), (5, 'OK'), (6, 'OK'), (7, 'OK'), (8, 'OK'), (9, 'OK')]



Когда запросы пришли в порядке очередности.
...
Рейтинг: 0 / 0
Сокеты: не получается обрабатывать входящие соединения
    #39647781
Патриот Израиля, я разобрался. Проблема в библиотеке multiprocessing по-ходу. Я с помощью баша попробовал множество кдиентских запросов сделать:

Код: sql
1.
2.
3.
4.
5.
6.
#!/usr/bin/env bash
# The & informs the shell to put the command in the background
for i in {0..10}
do
  ./client.py --payload "{\"method\": \"echo\", \"params\": [\"Echo!\"], \"id\": $i}" >> out.txt &
done



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
{"jsonrpc": "2.0", "result": "Echo!", "id": 0}
{"jsonrpc": "2.0", "result": "Echo!", "id": 1}
{"jsonrpc": "2.0", "result": "Echo!", "id": 3}
{"jsonrpc": "2.0", "result": "Echo!", "id": 4}
{"jsonrpc": "2.0", "result": "Echo!", "id": 6}
{"jsonrpc": "2.0", "result": "Echo!", "id": 9}
{"jsonrpc": "2.0", "result": "Echo!", "id": 8}
{"jsonrpc": "2.0", "result": "Echo!", "id": 7}
{"jsonrpc": "2.0", "result": "Echo!", "id": 2}
{"jsonrpc": "2.0", "result": "Echo!", "id": 10}
{"jsonrpc": "2.0", "result": "Echo!", "id": 5}



все работает
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Сокеты: не получается обрабатывать входящие соединения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]