未知
CrowdProcess的Python项目详细描述
这是CrowdProcess的客户端 REST API。
它在Python2.7和3.4+中工作。
安装
pip install crowdprocess
或
easy_install crowdprocess
用法示例
>>>fromcrowdprocessimportCrowdProcess>>>crp=CrowdProcess('username','password')>>>x2=crp.job('function Run (d) { return d*2; }')>>>results=x2(range(5)).results>>>list(results)[0,2,4,6,8,10]# comes in a random order
更详细的使用
导入和实例化
>>>fromcrowdprocessimportCrowdProcess>>>crp=CrowdProcess('username@email.com','password')
要拿到那些证书你必须 register使用crowdprocess。
您还可以用令牌而不是用户名来实例化它,然后 密码:
>>>crp=CrowdProcess(token='3c46d593-5435-47c5-92aa-1613ade978c2')
工作
创建作业
上面实例化了CrowdProcess类,
>>>program='function Run (d) { return d }'>>>job=crp.job(program)>>>job.id'3c46d593-5435-47c5-92aa-1613ade978c2'
使用program参数自动调用crp.job。 在crowdprocess中创建作业并返回实例Job。
当你得到一个job.id后,你可以用它再次得到一个Job, 不创建:
>>>job=crp.job(id='3c46d593-5435-47c5-92aa-1613ade978c2')
列出作业
>>>crp.list_jobs()[{u'status':u'active',u'failed':0,u'bid':1,u'created':u'2014-05-14T10:07:52.747503Z',u'modified':u'2014-05-14T10:07:53.716147Z',u'browserHours':137,u'finished':1000,u'lastResult':u'2014-05-14T10:07:59.06Z',u'total':1000,u'id':u'3c46d593-5435-47c5-92aa-1613ade978c2'}]
更漂亮:
>>>jobs=crp.list_jobs()>>>print(json.dumps(jobs,sort_keys=True,indent=2))[{"bid":1,"browserHours":137,"created":"2014-05-14T10:07:52.747503Z","failed":0,"finished":1000,"id":"3c46d593-5435-47c5-92aa-1613ade978c2","lastResult":"2014-05-14T10:07:59.06Z","modified":"2014-05-14T10:07:53.716147Z","status":"active","total":1000}]
删除作业
>>>job=crp.job(id='3c46d593-5435-47c5-92aa-1613ade978c2')>>>job.delete()
删除所有作业
>>>crp.delete_jobs()
任务和结果
创建作业后,您就可以发送任务并返回 结果。
tasks可以是任何iterable对象,results将是生成器:
>>>job=crp.job('function Run (d) { return Math.pow(d, 2); }')>>>tasks=[0,1,2,3,4,5,6,7,8,9]>>>results=job(tasks).results>>>list(results)[49,64,16,25,9,36,4,81,0,1]
与,
>>>job=crp.job('function Run (d) { return Math.pow(d, 2); }')>>>list(job(range(10)).results)[49,64,16,25,9,36,4,81,0,1]
这也与,
>>>job=crp.job('function Run (d) { return Math.pow(d, 2); }')>>>deftasks():...foriinrange(10):...yieldi...>>>list(job(tasks).results)[25,64,49,16,36,9,0,81,1,4]
请注意,结果从来都不是按顺序排列的。
专业提示:您可以将一个作业的结果用作另一个作业的任务
>>>multiply=crp.job('function Run (d) { return d*2 }')>>>divide=crp.job('function Run (d) { return d/2 }')>>>numbers=range(10)>>>multiplied=multiply(numbers).results>>>divided=divide(multiplied).results>>>list(divided)[7,2,6,1,5,9,8,4,3,0]
不要忘记错误
有时你的任务会抛出你应该知道的意外的异常。 关于,您可以使用与获得结果相同的方式获得结果:
>>>job=crp.job('function Run (d) { if (d === 4) { throw new Error("oh no, "+d) } return d; }')>>>tasks=range(10)>>>errors=job(tasks).errors>>>forerrorinerrors:...printerror
任务和结果,较低级别
提交任务
同样,任务也可以是任何iterable:
>>>multiply=crp.job('function Run (d) { return d*2 }')>>>multiply.submit_tasks(range(10))
获得结果
>>>results=multiply.get_results()>>>list(results)[18,8,10,4,6,16,14,0,2,12]
这将提供当前作业的所有计算结果,但是 事实上,应该在计算出每个结果后立即在流中获取:
流结果
您还可以在每次结果出现时对其进行迭代:
>>>expected_results=10>>>results=multiply.get_results_stream()>>>forresultinresults:...print(result)...expected_results-=1...ifexpected_results==0:...break
流不知道是否或何时可以计算结果,并且 交付,所以您必须计算您仍希望打破多少结果 循环。
要正确使用此功能,您应该开始侦听流结果 在发送任务之前,可能有一个单独的线程:
>>>importthreading>>>job=crp.job("function Run(d) { return d; }")>>>defget_results():...expected_results=10...forresultinjob.get_results_stream():...print(result)...expected_results-=1...ifexpected_results==0:...break...>>>t=threading.Thread(target=get_results)>>>t.start()>>>job.submit_tasks(range(10))>>>7962381405>>>t.join()
有时你的任务会有意外的异常,而这些异常会导致 一个结果不能被交付,所以你必须解释这些以及 减少预期的结果计数器。
错误和流错误
有时您的任务会抛出意外异常,您应该得到它们:
>>>program=""" ... function Run (d) { ... if (d === 4) { ... throw new Error("oops, it's "+d); ... } else { ... return d; ... } ... } ... """>>>job=crp.job(program)>>>job.submit_tasks(range(10))>>>list(job.get_results())[1,6,9,8,5,7,2,3,0]# oh no, 4 is missing...>>>list(job.get_errors())[{u'message':u"oops, it's 4",u'type':u'program',u'name':u'Error',u'stack':u'Run@blob:9a4029f7-fff7-4da8-b552-92507e341749:5\n[2]</</self.onmessage@blob:9a4029f7-fff7-4da8-b552-92507e341749:9\n'}]>>>print(json.dumps(list(job.get_errors()),sort_keys=True,indent=2))# prettier[{"message":"oops, it's 4","name":"Error","stack":"Run@blob:9a4029f7-fff7-4da8-b552-92507e341749:5\n[2]</</self.onmessage@blob:9a4029f7-fff7-4da8-b552-92507e341749:9\n","type":"program"}]
与获取流结果的方式相同,您可以(也应该)获取 流错误:
>>>errors=multiply.get_errors_stream()>>>forerrorinerrors:...print(error)