// 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);
}
}
}
Почему бы не попытаться использовать уникальное имя файла? Таким образом, вы уверены, что не будет столкновения имен. Взгляните на https://docs.python.org/2/library/tempfile.html , рассмотрите функцию NamedTeoraryFile. Вы должны использовать delete = False, в противном случае файл сразу удаляется после закрытия ().
В соответствии с вашим вопросом я понимаю, что у вас есть только один принтер для этикеток, и у вас есть несколько производителей, которые пытаются печатать на нем этикетки.
Так что даже если вы переключитесь на многопоточность, вам придется синхронизировать потоки, чтобы избежать взаимных блокировок и бесконечного ожидания,
Так что мой лучший вариант - использовать встроенную структуру данных python, которая называется очередь
в соответствии с документ
Модуль очереди реализует многопользовательские очереди с несколькими потребителями. Это особенно полезно в многопоточном программировании, когда необходимо безопасно обмениваться информацией между несколькими потоками. Класс Queue в этом модуле реализует всю необходимую семантику блокировки. Это зависит от доступности поддержки потоков в Python,
blockquote>Несмотря на то, что это многопользовательская, многопользовательская очередь, я предполагаю, что она все равно будет работать для вас как чудо.
Итак, вот что вам нужно сделать
- Ваш сервер получает запрос на печать этикетки,
- выполнить необходимую обработку / очистку и поместить он в очереди
- Рабочий поток извлекает элементы из очереди и выполняет задачу
или, если вы ожидаете, что система будет достаточно большой, вот несколько ссылок, но шаги будут такими же, как указано выше
RabbitMq - масштабируемый брокер сообщений (просто поставьте очередь)
[113 ] Celery - пакет Python для получения элементов из брокера сообщений, такого как rabbitmq, и запуска его