Я использую модуль потоков для запуска функции в фоновом режиме, в то время как остальная часть моего сценария выполняется. Потоковая функция содержит цикл for, который ожидает внешних 5-вольтных триггеров, возникающих каждые 15 мс, прежде чем перейти к следующей итерации цикла.
Когда этот код работает только на ПК, все работает как положено. Однако когда я запускаю другие необходимые приложения, нагружая процессор, цикл For в поточной функции выполняется только и продолжается до следующей итерации в течение 15 мс времени примерно в 90% времени.
Введением в многопоточную функцию является список указателей ctypes.
Я запускаю многопоточную функцию из класса, поэтому использование многопроцессорности сложно (если это вообще поможет, я не уверен).
Я попытался проиллюстрировать проблему ниже скелетом двух классов
import ctypes
import Write_transient_frames_func
import SendScriptCommands
from threading import Thread
class SlmInterface():
def __init__(self,sdk):
self.sdk = sdk
def precalculate_masks(self, mask_list):
'''takes input mask_list, a list of numpy arrays containing phase masks
outputs pointers to memory location of masks
'''
#list of pointers to locations of phase mask arrays in memory
mask_pointers = [mask.ctypes.data_as(POINTER(c_ubyte)) for mask in mask_list]
return mask_pointers
def load_precalculated_triggered(self, mask_pointers):
okay = True
print('Ready to trigger')
for arr in mask_pointers:
okay = self.Write_transient_frames_func(self.sdk, c_int(1), arr, c_bool(1), c_bool(1), c_uint(0))
assert okay, 'Failed to write frames to board'
print('completed trigger sequence')
class Experiment():
def run_experiment(self, sdk, mask_list):
slm = SlmInterface(sdk)
#list of ctypes pointers
mask_pointers = slm.precalculate_masks(mask_list)
##the threaded function
slm_thread = Thread(target=slm.load_precalculated_triggered, args = [mask_pointers])
slm_thread.start()
time.sleep(0.1)
# this function loads the 15ms trigger sequences to the hardware and begins the sequence
self.mp_output = SendScriptCommands()
Можно ли ускорить выполнение резьбовой функции? Поможет ли параллельная обработка? Или я принципиально ограничен моим процессором?