Skip to content

Use thread pool for faster network IO #14

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 28 additions & 6 deletions pypiup/requirements.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from multiprocessing.dummy import Pool as ThreadPool

import click
from pypiup.requirement import Requirement

Expand All @@ -22,17 +24,24 @@ def read_file(self, requirements_filename):
try:
requirements_file = open(requirements_filename)
requirements_file_lines = requirements_file.read().splitlines()
pool = ThreadPool()
lines = [
line for line in requirements_file_lines
if not self.should_ignore_requirement(line)
]
with click.progressbar(
iterable=requirements_file_lines,
length=len(lines),
label='Getting requirements details',
bar_template='%(label)s %(bar)s | %(info)s',
fill_char=click.style(u'█', fg='cyan'),
empty_char=' ') as bar:
requirements = []
for line in bar:
if not self.should_ignore_requirement(line):
requirement = Requirement(line)
requirements.append(requirement)
# Apply decorator
req_with_upd = barupdate(bar)(Requirement)
requirements = pool.map(req_with_upd, lines)
# cleanup and wait for work to finish
pool.close()
pool.join()

self.requirements = requirements
self.show_details()
self.show_stats()
Expand Down Expand Up @@ -69,3 +78,16 @@ def show_stats(self):
click.echo(" Update available: %s" % stat_needs_update)
click.echo(" Invalid Semver: %s" % stat_invalid_semver)
click.echo(" Non PyPI Requirements: %s" % stat_invalid)


def barupdate(bar_obj, size=1):
"""Decorator for updating progressbar after
object instantiation complete.
"""
def decorator(cls):
def inner(*args, **kwargs):
instance = cls(*args, **kwargs)
bar_obj.update(size)
return instance
return inner
return decorator