worker
işlevinizi değiştirmenize gerek kalmadan bunu yapmanın bir yolu. Buradaki fikir, çalışanı bir arka plan iş parçacığında worker
arayacak ve ardından timeout
saniye için bir sonuç bekleyecek olan başka bir işleve sarmaktır. Zaman aşımı süresi dolarsa, o aniden iplik worker
sonlandırır bir istisna, yürütülüyor yükseltir:
import multiprocessing
from multiprocessing.dummy import Pool as ThreadPool
from functools import partial
def worker(x, y, z):
pass # Do whatever here
def collectMyResult(result):
print("Got result {}".format(result))
def abortable_worker(func, *args, **kwargs):
timeout = kwargs.get('timeout', None)
p = ThreadPool(1)
res = p.apply_async(func, args=args)
try:
out = res.get(timeout) # Wait timeout seconds for func to complete.
return out
except multiprocessing.TimeoutError:
print("Aborting due to timeout")
p.terminate()
raise
if __name__ == "__main__":
pool = multiprocessing.Pool()
featureClass = [[1000,k,1] for k in drange(start,end,step)] #list of arguments
for f in featureClass:
abortable_func = partial(abortable_worker, worker, timeout=3)
pool.apply_async(abortable_func, args=f,callback=collectMyResult)
pool.close()
pool.join()
multiprocessing.TimeoutError
yükseltecektir zaman aşımı Herhangi fonksiyonu. Bunun, bir zaman aşımı gerçekleştiğinde geri aramanın yürütülmeyeceği anlamına geldiğini unutmayın. Bu kabul edilemezse, raise
numaralı telefonu aramak yerinenumaralı telefon numarasını aramak için abortable_worker
numaralı except
bloğunu değiştirin.
İşçi nasıl görünüyor? Bunu bir "çok işlemciyle" yapmanın en kolay yolu "işçi" yi kesintiye uğratmaktır, ancak bu, ne yaptığına bağlı olarak mümkün olmayabilir. – dano
worker, bir liste girişi ve bir liste çıktısı ile basit bir işlevdir – farhawa
Aslında ne yapıyor? Listede yinelendiğini sanıyorum, ama her bir öğe üzerinde ne tür işlemler yapıyor? Her operasyon ne kadar sürer? – dano