Không có output > a given number
chỉ định nên tôi chỉ cần làm một. Sau khi thử nghiệm tôi đã phải đảo ngược điều kiện để hoạt động đúng output < a given number
.
Tôi sẽ sử dụng một nhóm, khởi chạy các quy trình với chức năng gọi lại để kiểm tra điều kiện dừng, sau đó chấm dứt nhóm khi sẵn sàng. nhưng điều đó sẽ gây ra một điều kiện cuộc đua cho phép bỏ qua các kết quả khỏi quá trình đang chạy mà không được phép kết thúc. Tôi nghĩ rằng phương pháp này có sửa đổi tối thiểu cho mã của bạn và rất dễ đọc. Thứ tự của danh sách KHÔNG được đảm bảo.
Ưu điểm: rất ít chi phí
Nhược điểm: có thể thiếu kết quả.
Phương pháp 1)
from scipy import *
import multiprocessing
import matplotlib.pyplot as plt
def stop_condition_callback(ret):
output.append(ret)
if ret < stop_condition:
worker_pool.terminate()
def func(x, y, ):
return y / x
def main(y, xmin, xmax, dx):
x = arange(xmin, xmax, dx)
print("Number of calculations: %d" % (len(x)))
# add calculations to the pool
for i in x:
worker_pool.apply_async(func, (i, y,), callback=stop_condition_callback)
# wait for the pool to finish/terminate
worker_pool.close()
worker_pool.join()
print("Number of results: %d" % (len(output)))
return x, asarray(output)
def demo():
x, z_list = main(2., 1., 30., .1)
plt.plot(z_list, label='desired range')
plt.show()
output = []
stop_condition = 0.1
worker_pool = multiprocessing.Pool()
demo()
Phương pháp này có nhiều chi phí hơn nhưng sẽ cho phép các quá trình đã bắt đầu kết thúc. Phương pháp 2)
from scipy import *
import multiprocessing
import matplotlib.pyplot as plt
def stop_condition_callback(ret):
if ret is not None:
if ret < stop_condition:
worker_stop.value = 1
else:
output.append(ret)
def func(x, y, ):
if worker_stop.value != 0:
return None
return y / x
def main(y, xmin, xmax, dx):
x = arange(xmin, xmax, dx)
print("Number of calculations: %d" % (len(x)))
# add calculations to the pool
for i in x:
worker_pool.apply_async(func, (i, y,), callback=stop_condition_callback)
# wait for the pool to finish/terminate
worker_pool.close()
worker_pool.join()
print("Number of results: %d" % (len(output)))
return x, asarray(output)
def demo():
x, z_list = main(2., 1., 30., .1)
plt.plot(z_list, label='desired range')
plt.show()
output = []
worker_stop = multiprocessing.Value('i', 0)
stop_condition = 0.1
worker_pool = multiprocessing.Pool()
demo()
Phương pháp 3) Ưu điểm: Không có kết quả nào bị bỏ qua
Nhược điểm: Bước này nằm ngoài những gì bạn thường làm.
lấy Phương thức 1 và thêm
def stopPoolButLetRunningTaskFinish(pool):
# Pool() shutdown new task from being started, by emptying the query all worker processes draw from
while pool._task_handler.is_alive() and pool._inqueue._reader.poll():
pool._inqueue._reader.recv()
# Send sentinels to all worker processes
for a in range(len(pool._pool)):
pool._inqueue.put(None)
Sau đó thay đổi stop_condition_callback
def stop_condition_callback(ret):
if ret[1] < stop_condition:
#worker_pool.terminate()
stopPoolButLetRunningTaskFinish(worker_pool)
else:
output.append(ret)