Advertisement
MiguelazoDS

Untitled

Sep 14th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.67 KB | None | 0 0
  1. #https://gist.github.com/cristipufu/2d8724a7b526ef57e73a4f1709fa5690
  2. #https://stackoverflow.com/questions/12474182/asynchronously-read-and-process-an-image-in-python
  3. import sys
  4. import random
  5. import time
  6. import multiprocessing
  7. import scipy.misc
  8. from multiprocessing import Semaphore, Queue
  9.  
  10. import cv2
  11. import numpy as np
  12. from matplotlib import pyplot as plt
  13.  
  14. class Producer(multiprocessing.Process):
  15.  
  16.     lista = ["1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg","6.jpg","7.jpg",
  17.              "8.jpg","9.jpg", "10.jpg", "11.jpg" , "12.jpg"]
  18.  
  19.     def __init__(self, images, can_produce, can_consume):
  20.         multiprocessing.Process.__init__(self)
  21.         self.images = images
  22.         self.can_produce = can_produce
  23.         self.can_consume = can_consume
  24.  
  25.     def produce_images(self):
  26.         for f in self.lista:
  27.         #   self.wait()
  28.             images.put(scipy.misc.imread(f))
  29.             self.can_consume.release() #aumento en uno la cantidad de permisos
  30.             print ("{}: i produced an images".format(self.name))
  31.         #   images.put(scipy.misc.imread('python.jpg'))
  32.  
  33.  
  34.     def wait(self):
  35.         time.sleep(random.uniform(0, 3))
  36.  
  37.     def run(self):
  38.         #Espera un tiempo, hace el aqcuire si hay lugar en la cola de semaforos
  39.         #para producir (cantidad de permisos menor a la del tamano del buffer),
  40.         #en caso de que no pueda hacer el acquire se queda esperando el release
  41.         #del consumidor. Cuando produce un item hace un release en el semaforo
  42.         #del consumidor (aumenta en una unidad los permisos).
  43. #       while 1:
  44.         #   self.wait()
  45.         self.can_produce.acquire() #disminuye en uno la cantidad de permisos
  46.         self.produce_images()
  47. #       self.can_consume.release() #aumento en uno la cantidad de permisos
  48.  
  49. class Consumer(multiprocessing.Process):
  50.  
  51.     def __init__( self, images, can_produce, can_consume ):
  52.         multiprocessing.Process.__init__(self)
  53.         self.images = images
  54.         self.can_produce = can_produce
  55.         self.can_consume = can_consume
  56.  
  57.     def consume_images(self):
  58.         try:
  59.             img = images.get()
  60.             #edges = cv2.Canny(img,100,200)
  61.             name = "./procesadas/" + str(random.randint(1, 1000))  +".jpg"
  62.             cv2.imwrite(name,edges)
  63.             print ("{}: i consumed an images".format(self.name))
  64.         except Queue.Empty:  # Queue here refers to the  module, not a class
  65.             print ('foo')
  66.  
  67.  
  68.     def wait(self):
  69.         time.sleep(random.uniform(0, 3))
  70.  
  71.     def run(self):
  72.         #Hace el aqcuire si hay lugar en la cola de semaforos
  73.         #para consumir en caso de que no pueda hacer el acquire se queda
  74.         #esperando el release del productor. Cuando consume un item hace un
  75.         #release en el semaforo del prodcutor (aumenta en una unidad los permisos).
  76.         while 1:
  77. #           self.wait()
  78.             self.can_consume.acquire()  #disminuye en uno la cantidad de permisos
  79.             self.consume_images()
  80.             self.can_produce.release()  #aumento en uno la cantidad de permisos
  81.  
  82.  
  83. if __name__ == "__main__":
  84.  
  85.     #ingreso por linea de comando cantidad de productores, consumidores y tamano de buffer
  86.     if len(sys.argv) != 4:
  87.         usage(sys.argv[0])
  88.         sys.exit(0)
  89.  
  90.     #count_producers = int(sys.argv[1])
  91.     count_producers = 1
  92.     count_consumers = int(sys.argv[2])
  93.     buffer_length = 15
  94.  
  95.     images = Queue()
  96.     producers = []
  97.     consumers = []
  98.  
  99.     #acquire mientras buffer no esta full
  100.     #crea semaforo con una cantidad "buffer_length" de permisos
  101.     can_produce = Semaphore(buffer_length)
  102.  
  103.     #acquire mientras buffer no este vacio
  104.     #crea semaforo con 0 de permisos que va llenando a medida que se produce
  105.     can_consume = Semaphore(0)
  106.  
  107.     producers = [Producer(images, can_produce, can_consume) for i in range(count_producers)]
  108.     consumers = [Consumer(images, can_produce, can_consume) for i in range(count_consumers)]
  109.  
  110.     for p in producers:
  111.         p.start()
  112.  
  113.     for c in consumers:
  114.         c.start()
  115.  
  116.     for p in producers:
  117.         p.join()
  118.  
  119.     for c in consumers:
  120.         c.join()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement