Processos e Workers
Multi-tarefa no 4D é a habilidade de ter várias operações que são executadas simultaneamente. Essas operações são chamadas processos. Processos múltiplos são como múltiplos usuários no mesmo computador, cada um trabalhando em sua própria tarefa. Isto significa, essencialmente, que cada método pode ser executado como uma tarefa distinta de base de dados.
Se você escrever código seguro para threads, você pode criar processos preemptivos que serão capazes de aproveitar o poder de processamento de computadores multi-core em suas aplicações compiladas, para execução mais rápida.
A aplicação 4D cria processos para suas próprias necessidades, por exemplo, o processo Principal para gerenciar as janelas de exibição da interface do usuário, o processo Design para gerenciar as janelas e editores do ambiente de design (observe que ambos são processos de trabalho), o processo Servidor Web, o processo Gerenciador de Cache, o processo de Indexação ou o processo Gerenciador de Eventos.
Criar e limpar processos
Existem várias maneiras de criar um processo:
- Execute um método no ambiente de Design após marcar a caixa de seleção Novo Processo na caixa de diálogo "Executar Método". O método escolhido na caixa de diálogo Executar Método é o método do processo.
- Use o comando
New process. The method passed as a parameter to theNew processcommand is the process method. - Use o comando
Execute on serverpara criar um procedimento armazenado no servidor. O método passado como parâmetro do comando é o método processo. - Use o comando
CALL WORKER. Se o processo worker ainda não existir, será criado.
Em aplicativos de desktop, os processos podem ser executados escolhendo comandos de menu. No Editor de Barra de Menu, selecione o comando de menu e marque a caixa de seleção Iniciar um Novo Processo. O método associado ao comando do menu é o método processo.
Um processo pode ser liberado sob as seguintes condições (as primeiras duas condições são automáticas):
- Quando o método processo termina de ser executado
- Quando o usuário sai da aplicação
- Se você parar o processo procedimentalmente ou usar o botão Abortar no Depurador ou no Explorador de Tempo de Execução
- If you call the
KILL WORKERcommand (to delete a worker process only).
Um processo pode criar outro processo. Os processos não são organizados hierarquicamente—todos os processos são iguais, independentemente do processo do qual foram criados. Uma vez que o processo "pai" cria um processo "filho", o processo filho continuará independentemente de o processo pai ainda estar em execução.
Elementos de um processo
Cada processo contém elementos específicos que podem ser tratados independentemente de outros processos.
Elementos da linguagem
- Variáveis: Cada processo tem suas próprias variáveis de processo. Variáveis de processo são reconhecidas apenas dentro do domínio de seu processo nativo.
- Conjuntos de processo: cada processo tem seus próprios conjuntos de processos.
LockedSeté um conjunto de processos. Os conjuntos processo são apagados assim que o método processo termina. - Método de tratamento de erros: Cada processo pode ter seu próprio método de tratamento de erros.
- Janela do Depurador: Cada processo pode ter sua própria janela do Depurador.
Elementos da interface
Elementos de interface são usados em Aplicações para Desktop. Eles consistem nos seguintes:
- Barra de menus: cada processo pode ter sua própria barra de menu atual. A barra de menu do processo ativo é a barra de menu atual para o aplicativo.
- Um ou mais janelas: Cada processo pode ter mais de uma janela aberta simultaneamente. Por outro lado, alguns processos não têm nenhuma janela.
- Uma janela ativa (em primeiro plano): Mesmo que um processo possa ter várias janelas abertas simultaneamente, cada processo tem apenas uma janela ativa. Para ter mais de uma janela ativa, você deve iniciar mais de um processo.
- Formulários de entrada e saída: Os formulários de entrada e saída padrão podem ser definidos processualmente para cada tabela em cada processo.
- Por padrão, os processos não incluem barras de menu, o que significa que os atalhos do menu Editar (em particular, cortar/copiar/colar) não estão disponíveis nas janelas de processo. Quando você chama caixas de diálogo ou editores do 4D (editor de formulários, editor de consultas, Requisição, etc.) de um processo, se você deseja que o usuário possa se beneficiar de atalhos de teclado como copiar/colar, você precisa garantir que o equivalente a um menu Editar esteja instalado no processo.
- Processos preemptivos e processos executados no servidor (procedimentos armazenados) não devem conter elementos da interface.
Cada processo também possui uma seleção atual e registro atual separados por tabela. Para obter mais informações sobre esses conceitos, consulte doc.4d.com.
Remote processes
When you create a process on a remote 4D, a "twin" process is created on the server to handle data access and database context as soon as it is necessary, i.e. the first time the process on the remote 4D needs to access data.
For optimization reason, while no server access is required, for example if the process on the remote 4D runs an event-handling method or controls floating windows, no twin process is created on the server.
Processos Worker
Usar um processo de trabalho é uma maneira simples e poderosa de trocar informações entre processos. Esta funcionalidade é baseada em um sistema de mensagens assíncrono que permite que processos e formulários sejam chamados e solicitados a executar métodos com parâmetros em seu próprio contexto.
Um trabalhador pode ser "contratado" por qualquer processo (usando o comando CALL WORKER) para executar métodos do projeto com parâmetros em seu próprio contexto, permitindo assim o acesso a informações compartilhadas.
No aplicativo Desktop, um método de projeto também pode ser executado com parâmetros no contexto de qualquer forma usando o comando CALL FORM.
Esta funcionalidade aborda as seguintes necessidades em relação à comunicação de interprocessos 4D:
- Uma vez que são suportados tanto por processos cooperativos quanto preemptivos, eles são a solução perfeita para comunicação entre processos em processos preemptivos (variáveis entre processos estão obsoletas e não são permitidas em processos preemptivos).
- Eles fornecem uma alternativa simples aos semáforos, que podem ser complicados de configurar e complexos de usar
Although they have been designed mainly for interprocess communication in the context of preemptive processes, CALL WORKER and CALL FORM can be used with cooperative processes.
Usando workers
Um worker é usado para solicitar a um processo que execute métodos projeto. Um worker consiste de:
- um nome único (warning: o nome diferencia maiúsculas de minúsculas), também usado para nomear seu processo associado
- um processo associado, que pode ou não existir em um determinado momento
- uma caixa de mensagem
- um método de inicialização (opcional)
You ask a worker to execute a project method by calling the CALL WORKER command. O trabalhador e sua caixa de mensagens são criados no primeiro uso; seu processo associado também é lançado automaticamente no primeiro uso. Se o processo do trabalhador morrer em seguida, a caixa de mensagem permanece aberta e qualquer nova mensagem na caixa iniciará um novo processo do trabalhador.
A animação a seguir ilustra esta sequência:

Unlike a process created with the New process command, a worker process remains alive after the execution of the process method ends. Isto significa que todas as execuções de métodos para o mesmo trabalhador serão executadas no mesmo processo, que mantém todas as informações do estado do processo (variáveis do processo, registro atual e seleção atual, etc.). Consequentemente, os métodos executados sucessivamente terão acesso e compartilharão as mesmas informações, permitindo a comunicação entre os processos. A caixa de mensagens do worker lida com chamadas sucessivas de forma assíncrona.
CALL WORKER encapsulates both the method name and command arguments in a message that is posted in the worker's message box. O processo do trabalhador é então iniciado, se já não existe e solicitado a executar a mensagem. O processo do trabalhador é então iniciado, se já não existe e solicitado a executar a mensagem. This means that CALL WORKER will usually return before the method is actually executed (processing is asynchronous). For this reason, CALL WORKER does not return any value. É claro que, nesse caso, o próprio chamador deve ser um worker.
It is not possible to use CALL WORKER to execute a method in a process created by the New process command. It is not possible to use CALL WORKER to execute a method in a process created by the New process command. Apenas os processos trabalhadores possuem uma caixa de mensagens e podem, portanto, serem chamados pelo CALL WORKER.
Worker processes can be created on 4D Server through stored procedures: for example, you can use the Execute on server command to execute a method that calls the CALL WORKER command.
Um processo de trabalho é encerrado por meio de uma chamada ao comando KILL WORKER, que esvazia a caixa de mensagens do trabalhador e solicita ao processo associado que pare de processar mensagens e termine sua execução atual assim que a tarefa atual for concluída.
O método de inicialização de um worker é o método usado para criar o trabalhador (na primeira utilização). If CALL WORKER is called with an empty method parameter, then the startup method is automatically reused as method to execute.
The main process created by 4D when opening a database for user and application modes is a worker process and can be called using CALL WORKER. Note that the name of the main process may vary depending on the 4D localization language, but it always has the process number 1; as a result, it's more convenient to designate it by process number instead of process name when calling CALL WORKER.
Identificação dos processos Worker
All worker processes, except the main process, have the process type Worker process (5) returned by the Process info command.
Ícones específicos identificam os processos worker.
Veja também
Para obter mais informações, consulte este post sobre como usar os workers.
Semáforos
um semáforo lhe permite ter certeza de que dois ou mais processos não modifiquem o mesmo recurso ao mesmo tempo. Só o processo que define o semáforo pode eliminá-lo.
Signals can also be used to manage interactions. Signals allow you to make sure one or more process(es) will wait for a specific task to be completed before continuing execution. Any process can wait and/or release a signal.
O que é um semáforo?
Em um programa de computador, um semáforo é uma ferramenta que é usada para proteger as ações que devem ser realizadas por um único processo ou usuário por vez.
Em 4D, a necessidade convencional de uso de um semáforo é para modificar um array inter-processo: se um processo estiver modificando os valores do array, outro processo não deve poder fazer a mesma coisa ao mesmo tempo. O desenvolvedor utiliza um semáforo para indicar a um processo que só pode realizar sua sequência de operações se nenhum outro processo estiver realizando as mesmas tarefas. Quando um processo encontra com um semáforo, há três possibilidades:
- Obtém imediatamente o direito a passar
- Espera seu turno até que obtém o direito a passar
- Continua seu caminho, abandonando a ideia de realizar as tarefas.
Portanto, o semáforo protege partes do código. Se permite passar só um processo de cada vez e bloqueia o acesso até que o processo que possui atualmente o direito de uso renuncie a este direito, liberando o semáforo.
Comandos para trabalhar com semáfoross
Em 4D, um semáforo é estabelecido chamando a função Semaphore. Para liberar um semáforo, se chama o comando CLEAR SEMAPHORE.
A função Semaphore tem um comportamento muito especial já que realiza potencialmente duas ações de cada vez:
- Se o semáforo já estiver assignado, a função devolve True
- Se não for assignado o semáforo, a função o assigna ao processo e devolve False ao mesmo tempo.
Esta ação dupla realizada pelo mesmo comando assegura que nenhuma operação externa pode ser inserida entre a proba do semáforo e sua atribuição.
Pode utilizar o comando Test semaphore para saber se um semáforo já estiver assignado ou não. Este comando se utiliza principalmente como parte das operações longas, tais como o fechamento anual das contas onde Test semaphore lhe permite controlar a interface para evitar o acesso a certas operações tais como a adição dos dados contáveis.
Como usar semáforos
Os semáforos devem ser utilizados respeitando os princípios a seguir:
- um semáforo deve ser definido e lançado no mesmo método,
- a execução de código protegido pelo semáforo deve ser a mas curta possível,
- o código deve ser temporizado por meio do parâmetro contTics da função Semaphore para esperar a liberação do semáforo.
Este é o código típico para o uso de um semáforo:
While(Semaphore("MySemaphore";300))
IDLE
End while
// place code protected by semaphore here
CLEAR SEMAPHORE("MySemaphore")
Um semáforo que não se libera pode bloquear parte do banco de dados. Configurar e liberar o semáforo no mesmo método ajuda a eliminar este risco.
Minimizar o código protegido pelo semáforo aumenta a fluidez da aplicação e evita que o semáforo seja um gargalo.
Por último, utilizando o parâmetro opcional contTics do comando Semaphore é essencial para otimizar a espera do semáforo a liberar. Utilizando este parâmetro, os comandos funcionam da maneira abaixo:
- O processo espera um número máximo especificado de tics (300 no exemplo) para que o semáforo esteja disponível, sem a execução de código passar para a próxima linha, Se o semáforo for liberado antes do final deste limite, ele é atribuído imediatamente ao processo (Semaphore devolve False) e se reinicia a execução de código, Se o semáforo não for liberado antes do final deste limite, a execução do código recomeça.
- O comando também dá prioridade às petições estabelecendo uma fila. Desta maneira, o primeiro processo que solicitar um semáforo será o primeiro em obter um.
Lembre que o tempo de espera se estabelece em função das características específicas da aplicação.
Semáforos globais ou locais
Há dois tipos de semáforos em 4D: semáforos locais e semáforos globais.
- Um semáforo local é visível para todos os processos de um mesmo posto e só no posto. Um semáforo local pode ser criado ao adicionar um prefixo ao nome do semáforo um sinal de dólar ($). Se utilizar semáforos locais para supervisar as operações entre os diferentes processos que são executados na mesma máquina. Por exemplo, um semáforo local pode ser utilizado para controlar o acesso a um array interprocesso compartido por todos os processos de um banco de dados mono usuário ou de um equipo cliente.
- Um semáforo global é acessível a todos os usuários e todos seus processos. Os semáforos globais são utilizados para controlar as operações entre os usuários de um banco de dados multi-usuário.
Os semáforos globais e locais são idênticos em sua lógica. A diferença está em seu alcance.
No modo cliente-servidor, os semáforos globais são compartidos entre todos os processos que são executados em todos os clientes e servidores. Um semáforo local somente se comparte entre os processos que se executam na máquina onde foi criado.
Em 4D, os semáforos globais ou locais têm o mesmo alcance, já que você é o único usuario. Entretanto, se seu banco de dados estiver sendo usado em ambas configurações, tenha certeza de usar semáforos globais ou locais, dependendo do que quiser fazer.
Nota: é recomendado o uso de semáforos locais quando precisar de um semáforo para gerenciar um aspecto local para um cliente da aplicação, tais como a interface ou um conjunto de variáveis inter processo. Se usar um semáforo global neste caso, não apenas haveria intercâmbios de rede desnecessários, mas também poderia afetar a outras máquinas clientes desnecessariamente. O uso de um semáforo local evitaria estes efeitos secundários indesejáveis.