我们从Python开源项目中,提取了以下43个代码示例,用于说明如何使用twisted.internet.task.Cooperator()。
def testStopRunning(self): """ Test that a running iterator will not run to completion when the cooperator is stopped. """ c = task.Cooperator() def myiter(): for myiter.value in range(3): yield myiter.value myiter.value = -1 d = c.coiterate(myiter()) d.addCallback(self.cbIter) d.addErrback(self.ebIter) c.stop() def doasserts(result): self.assertEquals(result, self.RESULT) self.assertEquals(myiter.value, -1) d.addCallback(doasserts) return d
def testStopOutstanding(self): """ Test that a running iterator paused on a third-party Deferred will properly stop when .stop() is called. """ testControlD = defer.Deferred() outstandingD = defer.Deferred() def myiter(): reactor.callLater(0, testControlD.callback, None) yield outstandingD self.fail() c = task.Cooperator() d = c.coiterate(myiter()) def stopAndGo(ign): c.stop() outstandingD.callback('arglebargle') testControlD.addCallback(stopAndGo) d.addCallback(self.cbIter) d.addErrback(self.ebIter) return d.addCallback(lambda result: self.assertEquals(result, self.RESULT))
def testCooperation(self): L = [] def myiter(things): for th in things: L.append(th) yield None groupsOfThings = ['abc', (1, 2, 3), 'def', (4, 5, 6)] c = task.Cooperator() tasks = [] for stuff in groupsOfThings: tasks.append(c.coiterate(myiter(stuff))) return defer.DeferredList(tasks).addCallback( lambda ign: self.assertEquals(tuple(L), sum(zip(*groupsOfThings), ())))
def testResourceExhaustion(self): output = [] def myiter(): for i in range(100): output.append(i) if i == 9: _TPF.stopped = True yield i class _TPF: stopped = False def __call__(self): return self.stopped c = task.Cooperator(terminationPredicateFactory=_TPF) c.coiterate(myiter()).addErrback(self.ebIter) c._delayedCall.cancel() # testing a private method because only the test case will ever care # about this, so we have to carefully clean up after ourselves. c._tick() c.stop() self.failUnless(_TPF.stopped) self.assertEquals(output, range(10))
def testStopRunning(self): """ Test that a running iterator will not run to completion when the cooperator is stopped. """ c = task.Cooperator() def myiter(): for myiter.value in range(3): yield myiter.value myiter.value = -1 d = c.coiterate(myiter()) d.addCallback(self.cbIter) d.addErrback(self.ebIter) c.stop() def doasserts(result): self.assertEqual(result, self.RESULT) self.assertEqual(myiter.value, -1) d.addCallback(doasserts) return d
def testStopOutstanding(self): """ An iterator run with L{Cooperator.coiterate} paused on a L{Deferred} yielded by that iterator will fire its own L{Deferred} (the one returned by C{coiterate}) when L{Cooperator.stop} is called. """ testControlD = defer.Deferred() outstandingD = defer.Deferred() def myiter(): reactor.callLater(0, testControlD.callback, None) yield outstandingD self.fail() c = task.Cooperator() d = c.coiterate(myiter()) def stopAndGo(ign): c.stop() outstandingD.callback('arglebargle') testControlD.addCallback(stopAndGo) d.addCallback(self.cbIter) d.addErrback(self.ebIter) return d.addCallback( lambda result: self.assertEqual(result, self.RESULT))
def testCooperation(self): L = [] def myiter(things): for th in things: L.append(th) yield None groupsOfThings = ['abc', (1, 2, 3), 'def', (4, 5, 6)] c = task.Cooperator() tasks = [] for stuff in groupsOfThings: tasks.append(c.coiterate(myiter(stuff))) return defer.DeferredList(tasks).addCallback( lambda ign: self.assertEqual(tuple(L), sum(zip(*groupsOfThings), ())))
def testResourceExhaustion(self): output = [] def myiter(): for i in range(100): output.append(i) if i == 9: _TPF.stopped = True yield i class _TPF: stopped = False def __call__(self): return self.stopped c = task.Cooperator(terminationPredicateFactory=_TPF) c.coiterate(myiter()).addErrback(self.ebIter) c._delayedCall.cancel() # testing a private method because only the test case will ever care # about this, so we have to carefully clean up after ourselves. c._tick() c.stop() self.assertTrue(_TPF.stopped) self.assertEqual(output, list(range(10)))
def setUp(self): """ Create a cooperator with a fake scheduler and a termination predicate that ensures only one unit of work will take place per tick. """ self._doDeferNext = False self._doStopNext = False self._doDieNext = False self.work = [] self.scheduler = FakeScheduler() self.cooperator = task.Cooperator( scheduler=self.scheduler, # Always stop after one iteration of work (return a function which # returns a function which always returns True) terminationPredicateFactory=lambda: lambda: True) self.task = self.cooperator.cooperate(self.worker()) self.cooperator.start()
def test_stopCooperatorReentrancy(self): """ If a callback of a L{Deferred} from L{CooperativeTask.whenDone} calls C{Cooperator.stop} on its L{CooperativeTask._cooperator}, the L{Cooperator} will stop, but the L{CooperativeTask} whose callback is calling C{stop} should already be considered 'stopped' by the time the callback is running, and therefore removed from the L{CoooperativeTask}. """ callbackPhases = [] def stopit(result): callbackPhases.append(result) self.cooperator.stop() # "done" here is a sanity check to make sure that we get all the # way through the callback; i.e. stop() shouldn't be raising an # exception due to the stopped-ness of our main task. callbackPhases.append("done") self.task.whenDone().addCallback(stopit) self.stopNext() self.scheduler.pump() self.assertEqual(callbackPhases, [self.task._iterator, "done"])
def __init__(self): self.coop = task.Cooperator(started=False)
def testStoppedRejectsNewTasks(self): """ Test that Cooperators refuse new tasks when they have been stopped. """ def testwith(stuff): c = task.Cooperator() c.stop() d = c.coiterate(iter(()), stuff) d.addCallback(self.cbIter) d.addErrback(self.ebIter) return d.addCallback(lambda result: self.assertEquals(result, self.RESULT)) return testwith(None).addCallback(lambda ign: testwith(defer.Deferred()))
def testUnexpectedError(self): c = task.Cooperator() def myiter(): if 0: yield None else: raise RuntimeError() d = c.coiterate(myiter()) return self.assertFailure(d, RuntimeError)
def testUnexpectedErrorNotActuallyLater(self): def myiter(): yield defer.fail(RuntimeError()) c = task.Cooperator() d = c.coiterate(myiter()) return self.assertFailure(d, RuntimeError)
def testCallbackReCoiterate(self): """ If a callback to a deferred returned by coiterate calls coiterate on the same Cooperator, we should make sure to only do the minimal amount of scheduling work. (This test was added to demonstrate a specific bug that was found while writing the scheduler.) """ calls = [] class FakeCall: def __init__(self, func): self.func = func def __repr__(self): return '<FakeCall %r>' % (self.func,) def sched(f): self.failIf(calls, repr(calls)) calls.append(FakeCall(f)) return calls[-1] c = task.Cooperator(scheduler=sched, terminationPredicateFactory=lambda: lambda: True) d = c.coiterate(iter(())) done = [] def anotherTask(ign): c.coiterate(iter(())).addBoth(done.append) d.addCallback(anotherTask) work = 0 while not done: work += 1 while calls: calls.pop(0).func() work += 1 if work > 50: self.fail("Cooperator took too long")
def parallel(iterable, parallel_count, callable, *args, **named): coop = task.Cooperator() work = (callable(elem, *args, **named) for elem in iterable) dl = defer.DeferredList([coop.coiterate(work) for i in xrange(parallel_count)]) return dl
def get_task(): if reactor.fake: task = Cooperator(scheduler=partial(FakeReactor().callLater, FakeReactor._DELAY)) else: task = real_task.Cooperator() return task
def _termination(self): """ This method can be used as the C{terminationPredicateFactory} for a L{Cooperator}. It returns a predicate which immediately returns C{False}, indicating that no more work should be done this iteration. This has the result of only allowing one iteration of a cooperative task to be run per L{Cooperator} iteration. """ return lambda: True
def setUp(self): """ Create a L{Cooperator} hooked up to an easily controlled, deterministic scheduler to use with L{FileBodyProducer}. """ self._scheduled = [] self.cooperator = task.Cooperator( self._termination, self._scheduled.append)
def test_defaultCooperator(self): """ If no L{Cooperator} instance is passed to L{FileBodyProducer}, the global cooperator is used. """ producer = FileBodyProducer(BytesIO(b"")) self.assertEqual(task.cooperate, producer._cooperate)
def test_pauseProducing(self): """ L{FileBodyProducer.pauseProducing} temporarily suspends writing bytes from the input file to the given L{IConsumer}. """ expectedResult = b"hello, world" readSize = 5 output = BytesIO() consumer = FileConsumer(output) producer = FileBodyProducer( BytesIO(expectedResult), self.cooperator, readSize) complete = producer.startProducing(consumer) self._scheduled.pop(0)() self.assertEqual(output.getvalue(), expectedResult[:5]) producer.pauseProducing() # Sort of depends on an implementation detail of Cooperator: even # though the only task is paused, there's still a scheduled call. If # this were to go away because Cooperator became smart enough to cancel # this call in this case, that would be fine. self._scheduled.pop(0)() # Since the producer is paused, no new data should be here. self.assertEqual(output.getvalue(), expectedResult[:5]) self.assertEqual([], self._scheduled) self.assertNoResult(complete)
def testStoppedRejectsNewTasks(self): """ Test that Cooperators refuse new tasks when they have been stopped. """ def testwith(stuff): c = task.Cooperator() c.stop() d = c.coiterate(iter(()), stuff) d.addCallback(self.cbIter) d.addErrback(self.ebIter) return d.addCallback(lambda result: self.assertEqual(result, self.RESULT)) return testwith(None).addCallback(lambda ign: testwith(defer.Deferred()))
def testUnexpectedErrorActuallyLater(self): def myiter(): D = defer.Deferred() reactor.callLater(0, D.errback, RuntimeError()) yield D c = task.Cooperator() d = c.coiterate(myiter()) return self.assertFailure(d, RuntimeError)
def testCallbackReCoiterate(self): """ If a callback to a deferred returned by coiterate calls coiterate on the same Cooperator, we should make sure to only do the minimal amount of scheduling work. (This test was added to demonstrate a specific bug that was found while writing the scheduler.) """ calls = [] class FakeCall: def __init__(self, func): self.func = func def __repr__(self): return '<FakeCall %r>' % (self.func,) def sched(f): self.assertFalse(calls, repr(calls)) calls.append(FakeCall(f)) return calls[-1] c = task.Cooperator(scheduler=sched, terminationPredicateFactory=lambda: lambda: True) d = c.coiterate(iter(())) done = [] def anotherTask(ign): c.coiterate(iter(())).addBoth(done.append) d.addCallback(anotherTask) work = 0 while not done: work += 1 while calls: calls.pop(0).func() work += 1 if work > 50: self.fail("Cooperator took too long")
def test_removingLastTaskStopsScheduledCall(self): """ If the last task in a Cooperator is removed, the scheduled call for the next tick is cancelled, since it is no longer necessary. This behavior is useful for tests that want to assert they have left no reactor state behind when they're done. """ calls = [None] def sched(f): calls[0] = FakeDelayedCall(f) return calls[0] coop = task.Cooperator(scheduler=sched) # Add two task; this should schedule the tick: task1 = coop.cooperate(iter([1, 2])) task2 = coop.cooperate(iter([1, 2])) self.assertEqual(calls[0].func, coop._tick) # Remove first task; scheduled call should still be going: task1.stop() self.assertFalse(calls[0].cancelled) self.assertEqual(coop._delayedCall, calls[0]) # Remove second task; scheduled call should be cancelled: task2.stop() self.assertTrue(calls[0].cancelled) self.assertIsNone(coop._delayedCall) # Add another task; scheduled call will be recreated: coop.cooperate(iter([1, 2])) self.assertFalse(calls[0].cancelled) self.assertEqual(coop._delayedCall, calls[0])
def test_runningWhenStarted(self): """ L{Cooperator.running} reports C{True} if the L{Cooperator} was started on creation. """ c = task.Cooperator() self.assertTrue(c.running)
def test_runningWhenRunning(self): """ L{Cooperator.running} reports C{True} when the L{Cooperator} is running. """ c = task.Cooperator(started=False) c.start() self.addCleanup(c.stop) self.assertTrue(c.running)
def test_runningWhenStopped(self): """ L{Cooperator.running} reports C{False} after the L{Cooperator} has been stopped. """ c = task.Cooperator(started=False) c.start() c.stop() self.assertFalse(c.running)
def _main(reactor, args, config): summary_hooks = stethoscope.plugins.utils.instantiate_plugins(config, namespace='stethoscope.batch.plugins.summary') if args.input is None: emails = config['BATCH_GET_EMAILS']() else: emails = [email.strip().strip('"') for email in args.input.readlines()] logger.info("retrieving devices for {:d} users", len(emails)) results = dict() deferreds = list() cooperator = task.Cooperator() work = work_generator(args, config, emails, results) for idx in six.moves.range(args.limit): deferreds.append(cooperator.coiterate(work)) deferred = defer.gatherResults(deferreds) def log_results(_): num_devices = sum(len(values) for values in six.itervalues(results)) logger.info("retrieved {:d} unique devices for {:d} users", num_devices, len(emails)) return _ deferred.addCallback(log_results) if not args.collect_only: for summary_hook in summary_hooks: def _hook(_): summary_hook.obj.post(results) return _ deferred.addCallback(_hook) return deferred
def test_whenDone(self): """ L{CooperativeTask.whenDone} returns a Deferred which fires when the Cooperator's iterator is exhausted. It returns a new Deferred each time it is called; callbacks added to other invocations will not modify the value that subsequent invocations will fire with. """ deferred1 = self.task.whenDone() deferred2 = self.task.whenDone() results1 = [] results2 = [] final1 = [] final2 = [] def callbackOne(result): results1.append(result) return 1 def callbackTwo(result): results2.append(result) return 2 deferred1.addCallback(callbackOne) deferred2.addCallback(callbackTwo) deferred1.addCallback(final1.append) deferred2.addCallback(final2.append) # exhaust the task iterator # callbacks fire self.stopNext() self.scheduler.pump() self.assertEqual(len(results1), 1) self.assertEqual(len(results2), 1) self.assertIs(results1[0], self.task._iterator) self.assertIs(results2[0], self.task._iterator) self.assertEqual(final1, [1]) self.assertEqual(final2, [2])
def getherproxy_req(self): """get proxy from gatherproxy.com""" block = True if not block: # method1-nonblock url = 'http://gatherproxy.com/proxylist/anonymity/?t=Elite' settings = Settings() @defer.inlineCallbacks def getpage(request,page): try: print("Request {},pagenumber:{}".format(request,page)) response = yield HTTP11DownloadHandler(settings).download_request(request,spider=None) if response.status==200: self._get_proxy(response.body.decode(),country=self.country) except Exception as e: print(e) print("[!] Failed: request {} of page:{}".format(request,page)) pass## def iter_page(): work =( getpage(FormRequest(url=url, headers=self.headers, formdata={'Type':'elite','PageIdx':str(page),'Uptime':'0'}, meta={'download_timeout':60}),page=page) for page in range(1,self.maxpage+1) ) coop = task.Cooperator() join = defer.DeferredList(coop.coiterate(work) for i in range(self.concurrent)) join.addBoth(lambda _: reactor.stop()) iter_page() reactor.run() else: # method 2- block url = 'http://gatherproxy.com/proxylist/anonymity/?t=Elite' for pagenum in range(1,self.maxpage+1): try: data = {'Type':'elite','PageIdx':str(pagenum),'Uptime':'0'} headers = copy.copy(self.headers) r = requests.post(url, headers=headers, data=data) except Exception as e: print(str(e)) print('[!] Failed: %s' % url) gatherproxy_list = [] return gatherproxy_list self._get_proxy(r.text,country=self.country)
def proxy_checker(self): """ Further test for proxy""" def main(): success={} settings = Settings() @defer.inlineCallbacks def getResponse(proxy,request): try: print("Request {} using proxy:{}".format(request,proxy)) response = yield HTTP11DownloadHandler(settings).download_request(request=request,spider=None) if response.status==200: success[proxy]=success.setdefault(proxy,0) + 1 print("Successful(+{}/{}) ip:{}".format(success[proxy],self.checknum,proxy)) if success[proxy]/self.checknum>= self.checkthreshold: self.passproxy.add(proxy) except Exception as e: #print(e) pass def output_better_proxy(_): """ writing proxies to file""" with open('validProxy.txt','w') as f: for p in self.passproxy: print(p) f.write(p+'\n') def iter_proxy(): # work needs to be a generator, i tried to use list but failed to realize concurrent work = ( getResponse(proxy,Request(url='http://myip.dnsdynamic.org', headers=self.headers, meta={ 'proxy':"http://"+proxy, 'download_timeout':self.timeout})) for proxy in self.proxy_list for times in range(self.checknum) ) coop = task.Cooperator() join = defer.DeferredList(coop.coiterate(work) for i in range(self.concurrent)) join.addCallback(output_better_proxy) join.addCallback(lambda _: reactor.stop()) iter_proxy() main() reactor.run()