1717import requests
1818import getpass
1919import json
20+ import signal
2021import sys
2122import time
2223from requests .compat import urljoin
@@ -35,7 +36,8 @@ def is_online(device):
3536 return r .json ()['state' ]
3637
3738
38- def retrieve (device , user , password , jobid ):
39+ def retrieve (device , user , password , jobid , num_retries = 3000 ,
40+ interval = 1 , verbose = False ):
3941 """
4042 Retrieves a previously run job by its ID.
4143
@@ -46,12 +48,13 @@ def retrieve(device, user, password, jobid):
4648 jobid (str): Id of the job to retrieve
4749 """
4850 user_id , access_token = _authenticate (user , password )
49- res = _get_result (device , jobid , access_token )
51+ res = _get_result (device , jobid , access_token , num_retries = num_retries ,
52+ interval = interval , verbose = verbose )
5053 return res
5154
5255
5356def send (info , device = 'sim_trivial_2' , user = None , password = None ,
54- shots = 1 , verbose = False ):
57+ shots = 1 , num_retries = 3000 , interval = 1 , verbose = False ):
5558 """
5659 Sends QASM through the IBM API and runs the quantum circuit.
5760
@@ -84,7 +87,9 @@ def send(info, device='sim_trivial_2', user=None, password=None,
8487 execution_id = _run (info , device , user_id , access_token , shots )
8588 if verbose :
8689 print ("- Waiting for results..." )
87- res = _get_result (device , execution_id , access_token )
90+ res = _get_result (device , execution_id , access_token ,
91+ num_retries = num_retries ,
92+ interval = interval , verbose = verbose )
8893 if verbose :
8994 print ("- Done." )
9095 return res
@@ -143,32 +148,47 @@ def _run(qasm, device, user_id, access_token, shots):
143148
144149
145150def _get_result (device , execution_id , access_token , num_retries = 3000 ,
146- interval = 1 ):
151+ interval = 1 , verbose = False ):
147152 suffix = 'Jobs/{execution_id}' .format (execution_id = execution_id )
148153 status_url = urljoin (_api_url , 'Backends/{}/queue/status' .format (device ))
149154
150- print ("Waiting for results. [Job ID: {}]" .format (execution_id ))
151-
152- for retries in range (num_retries ):
153- r = requests .get (urljoin (_api_url , suffix ),
154- params = {"access_token" : access_token })
155- r .raise_for_status ()
156-
157- r_json = r .json ()
158- if 'qasms' in r_json :
159- qasm = r_json ['qasms' ][0 ]
160- if 'result' in qasm :
161- return qasm ['result' ]
162- time .sleep (interval )
163- if device in ['ibmqx4' , 'ibmqx5' ] and retries % 60 == 0 :
164- r = requests .get (status_url )
155+ if verbose :
156+ print ("Waiting for results. [Job ID: {}]" .format (execution_id ))
157+
158+ original_sigint_handler = signal .getsignal (signal .SIGINT )
159+
160+ def _handle_sigint_during_get_result (* _ ):
161+ raise Exception ("Interrupted. The ID of your submitted job is {}."
162+ .format (execution_id ))
163+
164+ try :
165+ signal .signal (signal .SIGINT , _handle_sigint_during_get_result )
166+
167+ for retries in range (num_retries ):
168+ r = requests .get (urljoin (_api_url , suffix ),
169+ params = {"access_token" : access_token })
170+ r .raise_for_status ()
165171 r_json = r .json ()
166- if 'state' in r_json and not r_json ['state' ]:
167- raise DeviceOfflineError ("Device went offline. The ID of your "
168- "submitted job is {}."
169- .format (execution_id ))
170- if 'lengthQueue' in r_json :
171- print ("Currently there are {} jobs queued for execution on {}."
172- .format (r_json ['lengthQueue' ], device ))
172+ if 'qasms' in r_json :
173+ qasm = r_json ['qasms' ][0 ]
174+ if 'result' in qasm and qasm ['result' ] is not None :
175+ return qasm ['result' ]
176+ time .sleep (interval )
177+ if device in ['ibmqx4' , 'ibmqx5' ] and retries % 60 == 0 :
178+ r = requests .get (status_url )
179+ r_json = r .json ()
180+ if 'state' in r_json and not r_json ['state' ]:
181+ raise DeviceOfflineError ("Device went offline. The ID of "
182+ "your submitted job is {}."
183+ .format (execution_id ))
184+ if verbose and 'lengthQueue' in r_json :
185+ print ("Currently there are {} jobs queued for execution "
186+ "on {}."
187+ .format (r_json ['lengthQueue' ], device ))
188+
189+ finally :
190+ if original_sigint_handler is not None :
191+ signal .signal (signal .SIGINT , original_sigint_handler )
192+
173193 raise Exception ("Timeout. The ID of your submitted job is {}."
174194 .format (execution_id ))
0 commit comments