MCPcopy Index your code
hub / github.com/HelloZeroNet/ZeroNet / Worker

Class Worker

src/Worker/Worker.py:9–165  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

7
8
9class 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:

Callers 1

addWorkerMethod · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected