Как делать бесконечные (или действительно глубокие) рекурсии в Stackless Python?

Я использую общий сервлет для каждой формы HTML, есть ли вложения или нет. Этот сервлет возвращает TreeMap, где ключи являются jsp name. Параметры и значения - это пользовательские входы и сохраняют все вложения в фиксированном каталоге, а затем вы переименовываете каталог по вашему выбору. Здесь Connections - это наш пользовательский интерфейс, имеющий объект подключения. Я думаю, что это поможет вам

public class ServletCommonfunctions extends HttpServlet implements
        Connections {

    private static final long serialVersionUID = 1L;

    public ServletCommonfunctions() {}

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException,
            IOException {}

    public SortedMap<String, String> savefilesindirectory(
            HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        // Map<String, String> key_values = Collections.synchronizedMap( new
        // TreeMap<String, String>());
        SortedMap<String, String> key_values = new TreeMap<String, String>();
        String dist = null, fact = null;
        PrintWriter out = response.getWriter();
        File file;
        String filePath = "E:\\FSPATH1\\2KL06CS048\\";
        System.out.println("Directory Created   ????????????"
            + new File(filePath).mkdir());
        int maxFileSize = 5000 * 1024;
        int maxMemSize = 5000 * 1024;
        // Verify the content type
        String contentType = request.getContentType();
        if ((contentType.indexOf("multipart/form-data") >= 0)) {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // maximum size that will be stored in memory
            factory.setSizeThreshold(maxMemSize);
            // Location to save data that is larger than maxMemSize.
            factory.setRepository(new File(filePath));
            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);
            // maximum file size to be uploaded.
            upload.setSizeMax(maxFileSize);
            try {
                // Parse the request to get file items.
                @SuppressWarnings("unchecked")
                List<FileItem> fileItems = upload.parseRequest(request);
                // Process the uploaded file items
                Iterator<FileItem> i = fileItems.iterator();
                while (i.hasNext()) {
                    FileItem fi = (FileItem) i.next();
                    if (!fi.isFormField()) {
                        // Get the uploaded file parameters
                        String fileName = fi.getName();
                        // Write the file
                        if (fileName.lastIndexOf("\\") >= 0) {
                            file = new File(filePath
                                + fileName.substring(fileName
                                        .lastIndexOf("\\")));
                        } else {
                            file = new File(filePath
                                + fileName.substring(fileName
                                        .lastIndexOf("\\") + 1));
                        }
                        fi.write(file);
                    } else {
                        key_values.put(fi.getFieldName(), fi.getString());
                    }
                }
            } catch (Exception ex) {
                System.out.println(ex);
            }
        }
        return key_values;
    }
}
3
задан hellopeach 24 March 2019 в 06:37
поделиться

1 ответ

После возни я получил следующий код, основанный на официальном примере кода более десяти лет назад здесь

https://bitbucket.org/stackless-dev/stacklessexamples/src/a01959c240e2aeae068e56b86b4c2a84a8d854e0 / examples /? at = default

, поэтому я изменил код рекурсивного сложения так, чтобы он выглядел следующим образом

import stackless


def call_wrapper(f, args, kwargs, result_ch):
    result_ch.send(f(*args, **kwargs))


def call(f, *args, **kwargs):
    result_ch = stackless.channel()
    stackless.tasklet(call_wrapper)(f, args, kwargs, result_ch)
    return result_ch.receive()


def rec_add(n):
    if n <= 1:
        return 1
    return n + call(rec_add, n-1)


print(rec_add(1000000))

Он работает с большим числом, например 1 000 000, я думаю, это своего рода косвенная рекурсия, поскольку функция вызывает другую функцию, которая запускает тасклет, который вызывает саму функцию (или что-то в этом роде).

Теперь мне интересно, действительно ли это предполагаемый способ реализации бесконечной рекурсии в Stackless Python или есть более прямые / прямые способы сделать это? Спасибо.

0
ответ дан hellopeach 24 March 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: