pymemcache не поддерживает кеширование python объектов - PullRequest
0 голосов
/ 26 апреля 2020

Я использовал это руководство для установки и настройки службы memcached на сервере. Затем я попытался взаимодействовать с memcached через pymemcached package.

Я использовал этот код как process1.py:

from time import sleep
from pymemcache.client.base import Client
from pymemcache import serde
import cv2
# import matplotlib.pyplot as plt


client = Client(('127.0.0.1', 11211),
                serializer=serde.python_memcache_serializer,
                deserializer=serde.python_memcache_deserializer)

# result = client.get('some_key')
cap = cv2.VideoCapture('video/vdo.mp4')

while True:
    ret, frame = cap.read()
    client.set("image", frame)
    print("cached")

    if not ret:
        break

    # cv2.imshow('Frame', frame)

    # Press Q on keyboard to  exit
    # if cv2.waitKey(25) & 0xFF == ord('q'):
    #     break

    sleep(0.05)

cap.release()

# Closes all the frames
cv2.destroyAllWindows()

А этот как process2.py:

import subprocess
import numpy as np
import cv2
from flask import Flask, Response
# from process1 import client

from pymemcache.client.base import Client
from pymemcache import serde

app = Flask(__name__)


client = Client(('127.0.0.1', 11211),
                serializer=serde.python_memcache_serializer,
                deserializer=serde.python_memcache_deserializer)


def gen():
    while True:
        # Capture frame-by-frame
        img = np.asarray(client.get('image'), np.uint8)
        if img is not None:
            # img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5)
            frame = cv2.imencode('.jpg', img)[1].tobytes()
            yield b'--frame\r\n'b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n'


@app.route('/')
def video_feed():
    """Video streaming route. Put this in the src attribute of an img tag."""
    return Response(gen(),
                    mimetype='multipart/x-mixed-replace; boundary=frame')


py_dir = "/home/masoud/anaconda3/envs/py37/bin/python"
process_dir = "/home/masoud/Desktop/PycharmProjects/share_memory_test"

if __name__ == '__main__':
    cmd = [py_dir, process_dir]
    subprocess.Popen(cmd)
    app.run(host='127.0.0.1', port=8888, debug=True)

Странно то, что я без проблем запустил этот код на своем ноутбуке в Ubuntu 18. Но когда я запустил его на сервере в моем офисе (с Ubuntu 16.04), я получил эту ошибку времени выполнения :

    File "codes/MSD/process1.py", line 139, in run
    client.set("stream_image_cached", a)
  File "anaconda3/envs/msd_ped_det/lib/python3.7/site-packages/pymemcache/client/base.py", 
line 341, in set flags=flags)[key]
  File "anaconda3/envs/msd_ped_det/lib/python3.7/site-packages/pymemcache/client/base.py", 
line 933, in _store_cmd self.sock.sendall(b''.join(cmds)) 

ConnectionResetError: [Errno 104] Connection reset by peer

Интересно, где еще я должен проверить, чтобы это заработало!

...