| 7 | |
| 8 | |
| 9 | class Worker(object): |
| 10 | |
| 11 | def __init__(self, manager, peer): |
| 12 | self.manager = manager |
| 13 | self.peer = peer |
| 14 | self.task = None |
| 15 | self.key = None |
| 16 | self.running = False |
| 17 | self.thread = None |
| 18 | self.num_downloaded = 0 |
| 19 | self.num_failed = 0 |
| 20 | |
| 21 | def __str__(self): |
| 22 | return "Worker %s %s" % (self.manager.site.address_short, self.key) |
| 23 | |
| 24 | def __repr__(self): |
| 25 | return "<%s>" % self.__str__() |
| 26 | |
| 27 | # Downloader thread |
| 28 | def downloader(self): |
| 29 | self.peer.hash_failed = 0 # Reset hash error counter |
| 30 | while self.running: |
| 31 | # Try to pickup free file download task |
| 32 | task = self.manager.getTask(self.peer) |
| 33 | if not task: # No more task |
| 34 | time.sleep(0.1) # Wait a bit for new tasks |
| 35 | task = self.manager.getTask(self.peer) |
| 36 | if not task: # Still no task, stop it |
| 37 | stats = "downloaded files: %s, failed: %s" % (self.num_downloaded, self.num_failed) |
| 38 | self.manager.log.debug("%s: No task found, stopping (%s)" % (self.key, stats)) |
| 39 | break |
| 40 | if not task["time_started"]: |
| 41 | task["time_started"] = time.time() # Task started now |
| 42 | |
| 43 | if task["workers_num"] > 0: # Wait a bit if someone already working on it |
| 44 | if task["peers"]: # It's an update |
| 45 | timeout = 3 |
| 46 | else: |
| 47 | timeout = 1 |
| 48 | |
| 49 | if task["size"] > 100 * 1024 * 1024: |
| 50 | timeout = timeout * 2 |
| 51 | |
| 52 | if config.verbose: |
| 53 | self.manager.log.debug("%s: Someone already working on %s (pri: %s), sleeping %s sec..." % ( |
| 54 | self.key, task["inner_path"], task["priority"], timeout |
| 55 | )) |
| 56 | |
| 57 | for sleep_i in range(1, timeout * 10): |
| 58 | time.sleep(0.1) |
| 59 | if task["done"] or task["workers_num"] == 0: |
| 60 | if config.verbose: |
| 61 | self.manager.log.debug("%s: %s, picked task free after %ss sleep. (done: %s)" % ( |
| 62 | self.key, task["inner_path"], 0.1 * sleep_i, task["done"] |
| 63 | )) |
| 64 | break |
| 65 | |
| 66 | if sleep_i % 10 == 0: |