Python - Обработка одновременных запросов POST с HTTPServer и сохранение в файлы

// Structered array for XML convertion.
$data_array = array(
  array(
    '#xml_tag' => 'a',
    '#xml_value' => '',
    '#tag_attributes' => array(
      array(
        'name' => 'a_attr_name',
        'value' => 'a_attr_value',
      ),
    ),
    '#subnode' => array(
      array(
        '#xml_tag' => 'aa',
        '#xml_value' => 'aa_value',
        '#tag_attributes' => array(
          array(
            'name' => 'aa_attr_name',
            'value' => 'aa_attr_value',
          ),
        ),
        '#subnode' => FALSE,
      ),
    ),
  ),
  array(
    '#xml_tag' => 'b',
    '#xml_value' => 'b_value',
    '#tag_attributes' => FALSE,
    '#subnode' => FALSE,
  ),
  array(
    '#xml_tag' => 'c',
    '#xml_value' => 'c_value',
    '#tag_attributes' => array(
      array(
        'name' => 'c_attr_name',
        'value' => 'c_attr_value',
      ),
      array(
        'name' => 'c_attr_name_1',
        'value' => 'c_attr_value_1',
      ),
    ),
    '#subnode' => array(
      array(
        '#xml_tag' => 'ca',  
        '#xml_value' => 'ca_value',
        '#tag_attributes' => FALSE,
        '#subnode' => array(
          array(
            '#xml_tag' => 'caa',
            '#xml_value' => 'caa_value',
            '#tag_attributes' => array(
              array(
                'name' => 'caa_attr_name',
                'value' => 'caa_attr_value',
              ),
            ),
            '#subnode' => FALSE,
          ),
        ),
      ),
    ),
  ),
);


// creating object of SimpleXMLElement
$xml_object = new SimpleXMLElement('<?xml version=\"1.0\"?><student_info></student_info>');


// function call to convert array to xml
array_to_xml($data_array, $xml_object);

// saving generated xml file
$xml_object->asXML('/tmp/test.xml');

/**
 * Converts an structured PHP array to XML.
 *
 * @param Array $data_array
 *   The array data for converting into XML.
 * @param Object $xml_object
 *   The SimpleXMLElement Object
 *
 * @see https://gist.github.com/drupalista-br/9230016
 * 
 */
function array_to_xml($data_array, &$xml_object) {
  foreach($data_array as $node) {
    $subnode = $xml_object->addChild($node['#xml_tag'], $node['#xml_value']);

    if ($node['#tag_attributes']) {
      foreach ($node['#tag_attributes'] as $tag_attributes) {
        $subnode->addAttribute($tag_attributes['name'], $tag_attributes['value']); 
      }
    }

    if ($node['#subnode']) {
      array_to_xml($node['#subnode'], $subnode);
    }
  }
}
1
задан Superdooperhero 18 January 2019 в 08:54
поделиться

2 ответа

Почему бы не попытаться использовать уникальное имя файла? Таким образом, вы уверены, что не будет столкновения имен. Взгляните на https://docs.python.org/2/library/tempfile.html , рассмотрите функцию NamedTeoraryFile. Вы должны использовать delete = False, в противном случае файл сразу удаляется после закрытия ().

0
ответ дан Marcel Preda 18 January 2019 в 08:54
поделиться

В соответствии с вашим вопросом я понимаю, что у вас есть только один принтер для этикеток, и у вас есть несколько производителей, которые пытаются печатать на нем этикетки.

Так что даже если вы переключитесь на многопоточность, вам придется синхронизировать потоки, чтобы избежать взаимных блокировок и бесконечного ожидания,

Так что мой лучший вариант - использовать встроенную структуру данных python, которая называется очередь

в соответствии с документ

Модуль очереди реализует многопользовательские очереди с несколькими потребителями. Это особенно полезно в многопоточном программировании, когда необходимо безопасно обмениваться информацией между несколькими потоками. Класс Queue в этом модуле реализует всю необходимую семантику блокировки. Это зависит от доступности поддержки потоков в Python,

Несмотря на то, что это многопользовательская, многопользовательская очередь, я предполагаю, что она все равно будет работать для вас как чудо.

Итак, вот что вам нужно сделать

  1. Ваш сервер получает запрос на печать этикетки,
  2. выполнить необходимую обработку / очистку и поместить он в очереди
  3. Рабочий поток извлекает элементы из очереди и выполняет задачу

или, если вы ожидаете, что система будет достаточно большой, вот несколько ссылок, но шаги будут такими же, как указано выше

0
ответ дан Shobi 18 January 2019 в 08:54
поделиться
Другие вопросы по тегам:

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