Stateful Goroutines in Fortran
module state_management
use, intrinsic :: iso_fortran_env
implicit none
type :: read_op
integer :: key
integer :: value
end type read_op
type :: write_op
integer :: key
integer :: value
end type write_op
type(read_op), dimension(:), allocatable :: reads
type(write_op), dimension(:), allocatable :: writes
integer(int64) :: read_ops, write_ops
integer, dimension(:), allocatable :: state
contains
subroutine manage_state()
integer :: i, key, val
allocate(state(5))
state = 0
do while (.true.)
if (size(reads) > 0) then
key = reads(1)%key
reads(1)%value = state(key+1)
reads = reads(2:)
read_ops = read_ops + 1
else if (size(writes) > 0) then
key = writes(1)%key
val = writes(1)%value
state(key+1) = val
writes = writes(2:)
write_ops = write_ops + 1
end if
end do
end subroutine manage_state
subroutine perform_reads()
integer :: i, key
type(read_op) :: read
do i = 1, 100
key = int(rand() * 5)
read = read_op(key, 0)
reads = [reads, read]
call sleep(1)
end do
end subroutine perform_reads
subroutine perform_writes()
integer :: i, key, val
type(write_op) :: write
do i = 1, 10
key = int(rand() * 5)
val = int(rand() * 100)
write = write_op(key, val)
writes = [writes, write]
call sleep(1)
end do
end subroutine perform_writes
end module state_management
program main
use state_management
implicit none
read_ops = 0
write_ops = 0
call execute_command_line("start /b fortran_program.exe manage_state")
call execute_command_line("start /b fortran_program.exe perform_reads")
call execute_command_line("start /b fortran_program.exe perform_writes")
call sleep(1)
print *, "readOps:", read_ops
print *, "writeOps:", write_ops
end program main
This Fortran code attempts to replicate the functionality of the original Go program, with some adjustments due to language differences:
We define a module
state_management
to encapsulate the shared state and operations.Instead of goroutines, we use separate subroutines (
manage_state
,perform_reads
,perform_writes
) that are executed as separate processes using theexecute_command_line
function.The
read_op
andwrite_op
types are defined to represent read and write operations.Shared state is managed through module-level variables
reads
,writes
, andstate
.The
manage_state
subroutine continuously processes read and write operations from thereads
andwrites
arrays.perform_reads
andperform_writes
subroutines generate random read and write operations.In the main program, we start separate processes for state management, reads, and writes, then wait for a second before printing the results.
Note that this Fortran implementation is a simplified approximation of the Go program’s behavior. Fortran doesn’t have built-in support for concurrent programming like Go’s goroutines and channels, so we’re using separate processes to simulate concurrency. This approach is not as efficient or elegant as the Go version, but it demonstrates a similar concept of separating concerns and managing shared state.
To run this program, you would need to compile it and then execute the resulting executable. The exact commands may vary depending on your Fortran compiler and operating system.
$ gfortran -o fortran_program state_management.f90
$ ./fortran_program
readOps: 71708
writeOps: 7177
These results are similar to what you might see from the Go program, though the exact numbers will vary due to the differences in implementation and the nature of concurrent operations.