Многопоточность с модулем работника - PullRequest
0 голосов
/ 26 августа 2011
import os
import urllib
import workerpool

from datetime import datetime

class DownloadJob(workerpool.Job):    

    def __init__(self, fa):
       self.fa = fa 

    def run(self):        
       f = open(self.fa + '.txt','w')
       f.write('Example Note.......')
       f.close()  


pool = workerpool.WorkerPool(size=5)

def workfile():        
    range1 = 51
    range2 = 102
    fam1 = 555
    fam2 = 833

    ranges = range2 -range1
    fams = fam2 -fam1
    workname = "Python"

    path = os.getcwd()

    os.system('mkdir ' + str(workname))
    sTime = datetime.now()

    for a in range(ranges + 1):
        os.chdir(path + '\\' + str(workname))
        os.system('mkdir ' + str(range1 + a))
        os.chdir(path + '\\' + str(workname) + '\\' + str(range1 + a))

        for b in range(fams + 1):
            fa = str(fam1 + b)
            job = DownloadJob(fa)
            pool.put(job)
            pool.shutdown()
            pool.wait()                                              

        print 'Elapsed Time: %s' % (datetime.now() - sTime)

        z = open('info.txt','w')
        z.write('Elapsed Time: %s' % (datetime.now() - sTime))
        z.close()

    os.chdir(path + '\\' + str(workname))

    tumSure = open('info.txt','w')
    tumSure.write('Elapsed All Time: %s' % (datetime.now() - sTime))
    tumSure.close()

    print 'All Time: %s' % (datetime.now() - sTime)        
    print 'Workname : %s downloaded.' % (workname)

    quit()

workfile()

Привет всем,

У меня есть код, как указано выше, и я хочу использовать логику потока для создания файла.Номера папок начинаются со слова range1, т. Е. 51. В этом каталоге создаются текстовые файлы с именами от 555.txt до 833.txt.Но после создания папки с именем 52 она останавливается, не в состоянии создать 555.txt до 833.txt.

, она думает, что останавливается, потому что

pool.shutdown()
pool.wait()

Как сделать циклпродолжать без остановки?

1 Ответ

3 голосов
/ 26 августа 2011

Я думаю, что вам следует отключить пул, только если вы закончили с ним, то есть после цикла for a, возможно, даже в предложении try...finally.

Это будет выглядеть так:

try:
    for a in range(ranges + 1):
        os.chdir(path + '\\' + str(workname))
        os.system('mkdir ' + str(range1 + a))
        os.chdir(path + '\\' + str(workname) + '\\' + str(range1 + a))

        for b in range(fams + 1):
            fa = str(fam1 + b)
            job = DownloadJob(fa)
            pool.put(job)
finally:
    pool.shutdown()
    pool.wait()

Таким образом, pool завершение работы

а) происходит только в том случае, если выполняется установка всего пула, и б) происходит, даже если есть исключение для чистого отключения.1012 * Если бы в пуле был менеджер контекста, это было бы еще проще.Но AFAICS, это не .В противном случае вы могли бы сделать

with pool:
    for a in range(ranges + 1):
        os.chdir(path + '\\' + str(workname))
        os.system('mkdir ' + str(range1 + a))
        os.chdir(path + '\\' + str(workname) + '\\' + str(range1 + a))

        for b in range(fams + 1):
            fa = str(fam1 + b)
            job = DownloadJob(fa)
            pool.put(job)

Но если вы хотите, вы можете сделать

from contextlib import contextmanager

@contextmanager
def shutdown_wait(pool):
    try:
        yield pool
    finally:
        pool.shutdown()
        pool.wait()

...
with shutdown_wait(pool):
    for a ... [as above]
...