Advertisement
MiguelazoDS

Untitled

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