# BEFORE CLIENT OPT: # Frames download time: 4.928671836853027 # GIF creation time: 5.02190637588501 # AFTER CLIENT OPT: # Frames download time: 3.885207176208496 # GIF creation time: 4.356576204299927 import os import socket import time import threading import multiprocessing from PIL import Image SERVER_URL = '127.0.0.1:1234' FILE_NAME = 'AmirlanSharipov.gif' CLIENT_BUFFER = 1024 FRAME_COUNT = 5000 MAXTHREADS = 8 MAXPROCESSES = 8 pool_sema = threading.BoundedSemaphore(value=MAXTHREADS) def routine_save_image(i): with pool_sema: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: ip, port = SERVER_URL.split(':') s.connect((ip, int(port))) image = b'' while True: packet = s.recv(CLIENT_BUFFER) if not packet: break image += packet with open(f'frames/{i}.png', 'wb') as f: f.write(image) def download_frames(): t0 = time.time() if not os.path.exists('frames'): os.mkdir('frames') threads = list() for i in range(FRAME_COUNT): t = threading.Thread(target=routine_save_image, args=(i, )) threads.append(t) for t in threads: t.start() for t in threads: t.join() return time.time() - t0 def get_RGBA(fname): return Image.open(fname).convert('RGBA') def create_gif(): t0 = time.time() frame_list = list() for frame_id in range(FRAME_COUNT): frame_list.append(f'frames/{frame_id}.png') with multiprocessing.Pool(MAXPROCESSES) as p: frames = p.map(get_RGBA, frame_list) frames[0].save(FILE_NAME, format="GIF", append_images=frames[1:], save_all=True, duration=500, loop=0) return time.time() - t0 if __name__ == '__main__': print(f"Frames download time: {download_frames()}") print(f"GIF creation time: {create_gif()}")