Какова лучшая практика для реализации Одиночных элементов в Perl?
Вы можете использовать модуль Class::Singleton.
Класс "Singleton" также может быть легко реализован с помощью переменной my
или state
(последняя доступна начиная с Perl 5.10). Но см. комментарий @Michael's ниже.
package MySingletonClass;
use strict;
use warnings;
use feature 'state';
sub new {
my ($class) = @_;
state $instance;
if (! defined $instance) {
$instance = bless {}, $class;
}
return $instance;
}
Если вы используете Moose, тогда MooseX :: Singleton . Его интерфейс совместим с Class :: Singleton.
SQLITE будет хорошим выбором, который я чувствую. Версия 3 и далее BLOB полностью поддерживается, поэтому можно подумать о SQLITE.
-121--5085931-Если дочерний процесс не является вашим собственным кодом, вы можете использовать этот код для поиска и уничтожения всех дочерних процессов:
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace Util {
public static class ProcessExtensions {
public static void KillDescendants(this Process processToNotKillYet) {
foreach (var eachProcess in Process.GetProcesses()) {
if (eachProcess.ParentPid() == processToNotKillYet.Id) {
eachProcess.KillTree();
}
}
}
public static void KillTree(this Process processToKill) {
processToKill.KillDescendants();
processToKill.Kill();
}
public static PROCESS_BASIC_INFORMATION Info(this Process process) {
var processInfo = new PROCESS_BASIC_INFORMATION();
try {
uint bytesWritten;
NtQueryInformationProcess(process.Handle,
0,
ref processInfo,
(uint)Marshal.SizeOf(processInfo),
out bytesWritten); // == 0 is OK
}
catch (Win32Exception e) {
if (!e.Message.Equals("Access is denied")) throw;
}
return processInfo;
}
public static int ParentPid(this Process process) {
return process.Info().ParentPid;
}
[DllImport("ntdll.dll")]
private static extern int NtQueryInformationProcess(
IntPtr hProcess,
int processInformationClass /* 0 */,
ref PROCESS_BASIC_INFORMATION processBasicInformation,
uint processInformationLength,
out uint returnLength);
[StructLayout(LayoutKind.Sequential)]
public struct PROCESS_BASIC_INFORMATION {
public int ExitStatus;
public int PebBaseAddress;
public int AffinityMask;
public int BasePriority;
public int Pid;
public int ParentPid;
}
}
}
-121--3867366- Singleton Summary:
Хотя синглтоны - хорошая идея, я склонен просто реализовать нормальный объект и использовать его. Если важно, чтобы у меня был только один такой объект, я изменю конструктор, чтобы создать фатальное исключение при создании второго объекта. Различные одиночные модули, кажется, не так много делают, кроме добавления зависимости.
Я делаю это потому, что это легко, это работает, и когда в каком-то странном будущем мне нужно работать со вторым объектом в моем приложении, изменения сводятся к минимуму.
Я также люблю локализовать взаимодействие с моими «одиночными» объектами - поддерживать взаимодействие как можно в нескольких местах. Поэтому вместо каждого объекта, имеющего прямой доступ к синглтону, я опосредую все взаимодействие через свой объект «Приложение». По возможности объект приложения получает данные из «singleton» и передает их в качестве параметра методу в других объектах. Ответы от других объектов также могут быть обработаны и переданы в «singleton». Все это помогает, когда мне нужно внести изменения в объект «singleton», и когда я хочу повторно использовать другие объекты в другом приложении, которые могут не нуждаться или иметь возможность использовать исходный объект «singleton».