Popcorn threaded tasks

Tasks allow you to execute code in another thread than the app listening loop. Useful when you want to run some tasks periodically.

Let's say you want to purge the downloads/ directory of your app every hour:

class PurgeTask
    super PopTask

    var dir: String

    redef fun main do
        loop
            dir.rmdir
            3600.sleep
        end
    end
end

var app = new App

# Register a new task
app.register_task(new PurgeTask("downloads/"))

# Add your handlers
# app.use('/', new MyHandler)

# Run the tasks
app.run_tasks

# Start the app
app.listen("0.0.0.0", 3000)

Introduced classes

abstract class PopTask

popcorn :: PopTask

An abstract Popcorn task

Redefined classes

redef class App

popcorn :: pop_tasks $ App

Popcorn application.

All class definitions

redef class App

popcorn :: pop_tasks $ App

Popcorn application.
abstract class PopTask

popcorn $ PopTask

An abstract Popcorn task
package_diagram popcorn::pop_tasks pop_tasks popcorn::pop_handlers pop_handlers popcorn::pop_tasks->popcorn::pop_handlers pthreads pthreads popcorn::pop_tasks->pthreads popcorn::pop_routes pop_routes popcorn::pop_handlers->popcorn::pop_routes csv csv popcorn::pop_handlers->csv core core pthreads->core ...popcorn::pop_routes ... ...popcorn::pop_routes->popcorn::pop_routes ...csv ... ...csv->csv ...core ... ...core->core popcorn::popcorn popcorn popcorn::popcorn->popcorn::pop_tasks popcorn::popcorn... ... popcorn::popcorn...->popcorn::popcorn

Ancestors

module abstract_collection

core :: abstract_collection

Abstract collection classes and services.
module abstract_text

core :: abstract_text

Abstract class for manipulation of sequences of characters
module array

core :: array

This module introduces the standard array structure.
module base64

base64 :: base64

Offers the base 64 encoding and decoding algorithms
module bitset

core :: bitset

Services to handle BitSet
module bytes

core :: bytes

Services for byte streams and arrays
module caching

serialization :: caching

Services for caching serialization engines
module circular_array

core :: circular_array

Efficient data structure to access both end of the sequence.
module codec_base

core :: codec_base

Base for codecs to use with streams
module codecs

core :: codecs

Group module for all codec-related manipulations
module collection

core :: collection

This module define several collection classes.
module core

core :: core

Standard classes and methods used by default by Nit programs and libraries.
module csv

csv :: csv

CSV document handling.
module engine_tools

serialization :: engine_tools

Advanced services for serialization engines
module environ

core :: environ

Access to the environment variables of the process
module error

core :: error

Standard error-management infrastructure.
module exec

core :: exec

Invocation and management of operating system sub-processes.
module file

core :: file

File manipulations (create, read, write, etc.)
module file_server

nitcorn :: file_server

Provides the FileServer action, which is a standard and minimal file server
module fixed_ints

core :: fixed_ints

Basic integers of fixed-precision
module fixed_ints_text

core :: fixed_ints_text

Text services to complement fixed_ints
module flat

core :: flat

All the array-based text representations
module gc

core :: gc

Access to the Nit internal garbage collection mechanism
module hash_collection

core :: hash_collection

Introduce HashMap and HashSet.
module http_errors

nitcorn :: http_errors

Offers ErrorTemplate to display error pages
module http_request

nitcorn :: http_request

Provides the HttpRequest class and services to create it
module http_request_buffer

nitcorn :: http_request_buffer

Http request parsing for buffered inputs.
module http_response

nitcorn :: http_response

Provides the HttpResponse class and http_status_codes
module inspect

serialization :: inspect

Refine Serializable::inspect to show more useful information
module iso8859_1

core :: iso8859_1

Codec for ISO8859-1 I/O
module kernel

core :: kernel

Most basic classes and methods.
module libevent

libevent :: libevent

Low-level wrapper around the libevent library to manage events on file descriptors
module list

core :: list

This module handle double linked lists
module math

core :: math

Mathematical operations
module md5

md5 :: md5

Native MD5 digest implementation as Text::md5
module media_types

nitcorn :: media_types

Services to identify Internet media types (or MIME types, Content-types)
module meta

meta :: meta

Simple user-defined meta-level to manipulate types of instances as object.
module more_collections

more_collections :: more_collections

Highly specific, but useful, collections-related classes.
module native

core :: native

Native structures for text and bytes
module nitcorn

nitcorn :: nitcorn

The nitcorn Web server framework creates server-side Web apps in Nit
module numeric

core :: numeric

Advanced services for Numeric types
module pop_routes

popcorn :: pop_routes

Internal routes representation.
module poset

poset :: poset

Pre order sets and partial order set (ie hierarchies)
module protocol

core :: protocol

module queue

core :: queue

Queuing data structures and wrappers
module range

core :: range

Module for range of discrete objects.
module re

core :: re

Regular expression support for all services based on Pattern
module reactor

nitcorn :: reactor

Core of the nitcorn project, provides HttpFactory and Action
module ropes

core :: ropes

Tree-based representation of a String.
module serialization

serialization :: serialization

General serialization services
module serialization_core

serialization :: serialization_core

Abstract services to serialize Nit objects to different formats
module server_config

nitcorn :: server_config

Classes and services to configure the server
module sessions

nitcorn :: sessions

Automated session management
module signal_handler

nitcorn :: signal_handler

Handle SIGINT and SIGTERM to close the server after all active events
module sorter

core :: sorter

This module contains classes used to compare things and sorts arrays.
module stream

core :: stream

Input and output streams of characters
module template

template :: template

Basic template system
module text

core :: text

All the classes and methods related to the manipulation of text entities
module time

core :: time

Management of time and dates
module token

nitcorn :: token

Simple generate_token service, independent of the rest of the nitcorn framework
module union_find

core :: union_find

union–find algorithm using an efficient disjoint-set data structure
module utf8

core :: utf8

Codec for UTF-8 I/O
module vararg_routes

nitcorn :: vararg_routes

Routes with parameters.

Parents

module pop_handlers

popcorn :: pop_handlers

Route handlers.
module pthreads

pthreads :: pthreads

Main POSIX threads support and intro the classes Thread, Mutex and Barrier

Children

module popcorn

popcorn :: popcorn

Application server abstraction on top of nitcorn.

Descendants

# Popcorn threaded tasks
#
# Tasks allow you to execute code in another thread than the app listening loop.
# Useful when you want to run some tasks periodically.
#
# Let's say you want to purge the `downloads/` directory of your app every hour:
#
# ~~~nitish
# class PurgeTask
#	super PopTask
#
#	var dir: String
#
#	redef fun main do
#		loop
#			dir.rmdir
#			3600.sleep
#		end
#	end
# end
#
# var app = new App
#
# # Register a new task
# app.register_task(new PurgeTask("downloads/"))
#
# # Add your handlers
# # app.use('/', new MyHandler)
#
# # Run the tasks
# app.run_tasks
#
# # Start the app
# app.listen("0.0.0.0", 3000)
# ~~~
module pop_tasks

import pop_handlers
import pthreads

# An abstract Popcorn task
#
# Redefine the `main` method to do something
#
# TODO provide a CRON-like syntax like SpringBoot?
abstract class PopTask
	super Thread

	redef fun main do return null
end

redef class App

	# Tasks to run
	var tasks = new Array[PopTask]

	# Register a new task in `self`
	fun register_task(task: PopTask) do tasks.add task

	# Run all registered tasks
	fun run_tasks do for task in tasks do task.start
end
lib/popcorn/pop_tasks.nit:17,1--78,3