реализация базового процесса очереди / потока в Python - PullRequest
0 голосов
/ 29 июля 2010

ищет несколько глазных яблок, чтобы убедиться, что следующий кусок псевдо-питона имеет смысл. Я надеюсь создать несколько потоков, чтобы реализовать некоторые функции inproc как можно быстрее. Идея состоит в том, чтобы порождать потоки в главном цикле, чтобы приложение одновременно запускало потоки в параллельном / параллельном режиме

chunk of code
 -get the filenames from a dir
 -write each filename ot a queue
 -spawn a thread for each filename, where each thread 
  waits/reads value/data from the queue
 -the threadParse function then handles the actual processing 
  based on the file that's included via the "execfile" function...


# System modules
from Queue import Queue
from threading import Thread
import time

# Local modules
#import feedparser

# Set up some global variables
appqueue = Queue()

# more than the app will need
# this matches the number of files that will ever be in the 
# urldir
#
num_fetch_threads = 200


def threadParse(q)
  #decompose the packet to get the various elements
  line = q.get()
  college,level,packet=decompose (line)

  #build name of included file
  fname=college+"_"+level+"_Parse.py"
  execfile(fname)
  q.task_done()


#setup the master loop
while True
  time.sleep(2)
  # get the files from the dir
  # setup threads
  filelist="ls /urldir"
  if filelist
    foreach file_ in filelist:
        worker = Thread(target=threadParse, args=(appqueue,))
        worker.start()

    # again, get the files from the dir
    #setup the queue
    filelist="ls /urldir"
    foreach file_ in filelist:
       #stuff the filename in the queue
       appqueue.put(file_)


    # Now wait for the queue to be empty, indicating that we have
    # processed all of the downloads.

  #don't care about this part

  #print '*** Main thread waiting'
  #appqueue.join()
  #print '*** Done'

Мысли / комментарии / указатели приветствуются ...

спасибо

1 Ответ

0 голосов
/ 29 июля 2010

Если я правильно понимаю: вы создаете множество потоков, чтобы сделать вещи быстрее.

Это работает, только если основная часть работы, выполняемой в каждом потоке, выполняется без удержания GIL. Так что если есть много данных, ожидающих данных из сети, с диска или чего-то в этом роде, это может быть хорошей идеей. Если в каждой из задач используется много ресурсов ЦП, это будет работать почти так же, как на одноядерном компьютере с 1 ЦП, и вы можете выполнять их последовательно.

Я должен добавить, что написанное мной верно для CPython, но не обязательно для Jython / IronPython. Кроме того, я должен добавить, что если вам нужно использовать больше процессоров / ядер, вам может помочь многопроцессорный модуль .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...