4D v16.3Processos 4D Preemptivos |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v16.3
Processos 4D Preemptivos
Processos 4D Preemptivos
4D Developer Edition de 64 bits para Windows (a partir de 4D V16 R2) e OS X vem com uma nova funcionalidade de grande alcance que lhe permite escrever e utilizar código 4D preemptivo. Graças a esta nova funcionalidade, seus aplicativos 4D compilados poderão aproveitar ao máximo os computadores de vários núcleos de modo que sua execução será mais rápida e pode suportar mais usuários conectados. Quando for executado em modo preemptivo, um processo estará dedicado a uma CPU. A gestão de processos então é delegada ao sistema, que pode adjudicar por separado cada CPU em uma máquina multi-núcleo. Quando for executado em modo cooperativo (o único modo disponível em 4D até 4D v15 R5), todos os processos serão gestionados pelo thread da aplicação pai e compartem a mesma CPU, mesmo em uma máquina multi-núcleo. Como resultado, no modo apropriativo, o rendimento global da aplicação é incrementado, especialmente em máquinas multi-núcleo, já que múltiplos processos (threads ou fios) podem ser executados simultaneamente. Entretanto, os ganhos reais dependem das operações executadas. Por outro lado, já que no modo apropriativo cada fio é independente dos demais e não é gestionado diretamente pela aplicação, limitações específicas se aplicam aos métodos que queira que sejam compatíveis com o modo apropriativo. Além disso, a execução apropriativa está disponível só em alguns contextos específicos. O uso do modo preemptivo está disponível nos seguintes contextos de execução:
Se o contexto de execução suporta o modo apropriativo e se o método for "thread seguro", um novo processo 4D lançado utilizando os comandos New process ou CALL WORKER ou do menu "Executar método" se executará em modo apropriativo. De outro modo, se chamar [#cmd id="317"/] ou CALL WORKER em um contexto de execução que não é suportado (por exemplo em uma máquina remota 4D) o processo é sempre cooperativo.Nota: Pode executar um processo em modo preemptivo a partir de um 4D remoto ao iniciar um procedimento armazenado no servidor com a linguagem, por exemplo usando Execute on server. O código 4D pode ser executado em fio (thread) apropriativo só quando algumas condições específicas forem cumpridas. Cada parte do código executado (comandos, métodos, variáveis...) deve ser compatível com uma execução apropriativa. Os elementos que podem ser executados em fios apropriativos são chamados threads seguros e os elementos que não podem ser executados em fios apropriativos são chamados threads inseguros. Nota: dado que um thread se maneja de forma independente a partir do método processo pai, toda a string de chamadas não deve incluir nenhum código thread inseguro, do contrário a execução apropriativa não será possível. Este ponto se discute no parágrafo Quando um processo é iniciado de forma preemptiva?. A propriedade "segurança de fio" de cada elemento depende do elemento em si:
Basicamente, o código que se executa em thread apropriativos não podem ser chamados as partes com as interações externas, tal como o código plug-in ou as variáveis interprocesso. Os acessos aos dados, entretanto, são permitidos desde o servidor de dados 4D que suporta a execução apropriativa. Como padrão, 4D executará todos os métodos de projeto em modo cooperativo. Se desejar se beneficiar da funcionalidade modo apropriativo, o primeiro passo consiste em declarar explícitamente todos os métodos que deseja que se iniciem em modo apropriativo sempre que for possível, ou seja, os métodos que considere capaz de executar em processo apropriativo. O compilador comprovará que estes métodos sejam na verdade thread seguro (ver Como escrever um código thread seguro para saber mais). Também pode desabilitar o modo apropriativo para alguns métodos, se for necessário. Lembre que definir um método como apropriativo faz com que seja elegível para execução apropriativa,mas não garante que se execute realmente em modo apropriativo. Iniciar um proceso em modo apropriativo resulta de uma avaliação realizada por 4D respeito as propriedades de todos os métodos na cadeia de chamadas de processo (para saber mais, consulte Quando um processo é iniciado de forma preemptiva?). Para declarar seu método de elegibilidade para o modo apropriativo, é necessário utilizar a opção de declaração Modo de execução no quadro de diálogo Propriedades de método: As seguintes opções estão disponíveis:
Lembre que com esta opção, qualquer que seja a avaliação interna thread de segurança, sempre se executará o método no modo cooperativo quando for chamado diretamente por 4D como o primeiro método de matriz (por exemplo através da [id #cmd = "317" /] de comandos). Se etiquetado como "thread-safe" internamente, só será levado em consideração quando for chamado desde outros métodos dentro de uma cadeia de chamadas. Nota: Um método de componente declarado como "Shared with components and host databases" também deve ser declarado "capable" para ser executado em uma thread preemptiva pelo banco de dados host. Quando exportar o código do método usando, por exemplo, METHOD GET CODE, a propriedade "preemptiva" é exportada no comentário "%attributes" com um valor de "capable" ou "incapable" (a propriedade não está disponível se a opção for "indiferente"). Os comandos METHOD GET ATTRIBUTES e METHOD SET ATTRIBUTES também obtém ou estabelecem o atributo "preemptivo" com um valo rde "indifferent", "capable", ou "incapable". A tabela abaixo resume os efeitos das opções de declaração do modo preemptivo
Lembrete: a execução apropriativa só está disponível em modo compilado. Em modo compilado, quando for iniciado um processo criado pelos métodos New process ou CALL WORKER, 4D lê a propriedade apropiativa do método processo (também chamado método pai) e executa o processo em modo apropriativo ou cooperativo, em função desta propriedade:
A propriedade segurança de thread depende da cadeia de chamadas. Se um método com a propriedade declarada "capaz" chamar a um método thread inseguro em qualquer de seus subníveis, um erro de compilação será devolvido: se um método único em toda a cadeia de chamadas for thread inseguro, "contaminará" todos os outros métodos e a execução apropriativa será recusada pelo compilador. Um thread apropriativo só pode ser criado quando toda a cadeia for thread seguro e o método de processo tiver sido declarado "Pode ser executado em processo apropiativo". Por exemplo, considere os métodos de projeto abaixo: //MyDialog project method //MyComp project method //CallDial project method //CallComp project method A tabela abaixo ilustra estas diversas situações:
Nota: o comando PROCESS PROPERTIES lhe permite saber se um processo é executado em modo apropriativo ou cooperativo. 4D lhe oferece novas funcionalidades para identificar a execução cooperativa ou apropriativa para processos:
Para ser thread seguro, um método deve respeitar as seguintes regras:
Nota: no caso de um método "Compartido por componentes e bancos de dados locais", a propriedade "Pode ser executado em processos preemptivos" deve ser selecionada. (*) Um novo tipo de processo chamado processo Worker, permite o intercâmbio de dados entre todos os processos, incluindo os processos preemptivos. Para saber mais, consulte Sobre Workers. Os métodos com a propriedade "Pode ser executado em processos preemptivos" serão verificados por 4D na etapa de compilação. Um erro de compilação se emite quando o compilador encontrar algo que lhe impeça ser thread seguro: O arquivo de símbolos, se estiver habilitado, també contém o estado de thread de segurança para cada método: Jà que são acessos "externos", as chamadas a objetos de interface de usuário, tais como formulários, assim como o Depurador não estão permitidas em threads preemptivos. Os únicos acessos possíveis a interface de usuário de um thread preemptivo são:
Um número significativo de comandos 4D são thread seguro. Na documentação, a imagem na área de propriedade de comando indica que o comando for thread seguro. Pode obter a lista de comandos thread seguro no manual Referência da linguagem. Também pode utilizar Command name que pode devolver a propriedade thread seguro para cada comando (ver abaixo). Quando um método que utiliza um comando que pode ser chamado um disparador (trigger), o compilador 4D avalia a segurança de thread do disparador para comprovar a segurança de thread do método: SAVE RECORD([Table_1]) //dispara em Table_1, se existir, deve ser thread seguro Esta é a lista de comandos que se verificam no momento da compilação para a segurança de thread dos disparadores:
Se a tabela for passada dinamicamente, o compilador pode algumas vezes não encontrar que trigger avaliar. Estes são alguns exemplos de cada situação: DEFAULT TABLE([Table_1]) Neste caso, todos os triggers são selecionados. Se um comando thread inseguro for detectado em pelo menos um trigger, todo o grupo é rejeitado e o método é declaro thread inseguro. Os métodos de captura de erros instalados pelo comando ON ERR CALL devem ser thread seguro se forprovável que sejam chamados desde um processo preemptivo. Com o fim de manejar este caso, o compilador verifica a propriedad de segurança de thread dos métodos de projeto de captura de erros passados ao comando ON ERR CALL durante a compilação e devolve os erros correspondentes se não cumprir com a execução preemptiva.. Lembre que esta comprovação só é possível quando o nome do método for passado como uma constante, e não for calculada, como se mostra abaixo: ON ERR CALL("myErrMethod1") //será verificado pelo compilador Além disso, a partir de 4D v15 R5, se um método de projeto de captura de erros não pode ser chamado em tempo de execução (depois de um problema de segurança thread, ou por qualquer razão como "método não encontrado"), um novo erro é gerado -10532 "Não pode ser chamado o método de projeto de gestão de erros 'methodName'". Um processo pode desreferenciar a um ponteiro para acessar ao valor de outra variável processo só se ambos processos são cooperativos, do contrário 4D gerará um erro. Em um processo preemptivo, se algum código 4D tentar desreferenciar um ponteiro a uma variável interprocesso, 4D gerará um erro. Exemplo com os seguintes métodos: Method1: myVar:=42 Method2: $value:=$1-> Se o processo que executa Method1 ou o processo que executa Method2 for preemptivo, a expressão "$value:=$1->" lançará um erro de execução. O uso de tipo parâmetros DocRef (referência de documentos abertos, usados ou retornados por Open document, Create document, Append document, CLOSE DOCUMENT, RECEIVE PACKET, SEND PACKET) é limitado aos contextos abaixo:
Para saber mais sobre referências DocRef, veja DocRef: Número de referencia do documento
Ver também
|
PROPRIEDADES
Produto: 4D
HISTÓRIA
Criado por: 4D v15 R5 ARTICLE USAGE
Manual de linguagem 4D ( 4D v16.1) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||