Bird
Raised Fist0
Flaskframework~20 mins

Gunicorn for production serving in Flask - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Gunicorn Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What happens when you run Gunicorn with multiple workers?

You start a Flask app using Gunicorn with the command gunicorn -w 4 app:app. What is the main effect of specifying -w 4?

AGunicorn runs 4 worker processes to handle requests concurrently.
BGunicorn runs 1 worker process but limits requests to 4 per second.
CGunicorn runs 4 threads inside a single process to handle requests.
DGunicorn runs 4 instances of the Flask app in the same process.
Attempts:
2 left
💡 Hint

Think about how Gunicorn manages multiple requests in production.

📝 Syntax
intermediate
2:00remaining
Identify the correct Gunicorn command to serve a Flask app on port 8080

You want to serve your Flask app using Gunicorn on port 8080. Which command is correct?

Agunicorn -p 8080 app:app
Bgunicorn --port 8080 app:app
Cgunicorn --host 0.0.0.0 --port 8080 app:app
Dgunicorn --bind 0.0.0.0:8080 app:app
Attempts:
2 left
💡 Hint

Check Gunicorn's option for binding to an address and port.

🔧 Debug
advanced
2:00remaining
Why does Gunicorn fail to start with this command?

You run gunicorn app.py to start your Flask app but Gunicorn fails with an error. What is the likely cause?

AGunicorn cannot run Flask apps without a <code>run()</code> call.
BGunicorn requires the <code>--bind</code> option to specify a port.
CGunicorn expects the app as <code>module:app</code>, not a filename.
DGunicorn needs the app to be named <code>application</code> instead of <code>app</code>.
Attempts:
2 left
💡 Hint

Consider how Gunicorn imports the Flask app.

❓ state_output
advanced
2:00remaining
What is the effect of setting the --timeout option in Gunicorn?

You run Gunicorn with --timeout 30. What happens if a worker takes longer than 30 seconds to respond?

AGunicorn queues the request until the worker finishes.
BGunicorn kills the worker and restarts it to free resources.
CGunicorn ignores the timeout and waits indefinitely.
DGunicorn logs a warning but keeps the worker running.
Attempts:
2 left
💡 Hint

Think about how Gunicorn handles stuck or slow workers.

🧠 Conceptual
expert
3:00remaining
Why is Gunicorn preferred over Flask's built-in server in production?

Choose the best reason why Gunicorn is used to serve Flask apps in production instead of Flask's built-in server.

AGunicorn handles multiple requests concurrently with worker processes, improving performance and reliability.
BFlask's built-in server does not support Python 3.12 and newer versions.
CGunicorn automatically converts Flask apps to asynchronous code for faster execution.
DFlask's built-in server requires a database connection, while Gunicorn does not.
Attempts:
2 left
💡 Hint

Consider concurrency and stability in production environments.

Practice

(1/5)
1. What is the main purpose of using Gunicorn with a Flask application in production?
easy
A. To automatically generate Flask routes based on database models
B. To provide a graphical user interface for Flask applications
C. To efficiently handle multiple user requests by running the Flask app with multiple workers
D. To replace Flask's built-in development server with a simpler one

Solution

  1. Step 1: Understand Flask's built-in server limitations

    Flask's built-in server is single-threaded and not suitable for handling many users in production.
  2. Step 2: Role of Gunicorn in production

    Gunicorn runs multiple worker processes to handle many requests efficiently in production environments.
  3. Final Answer:

    To efficiently handle multiple user requests by running the Flask app with multiple workers -> Option C
  4. Quick Check:

    Gunicorn improves concurrency = A [OK]
Hint: Gunicorn runs multiple workers to handle many users [OK]
Common Mistakes:
  • Thinking Gunicorn provides a GUI
  • Believing Gunicorn auto-generates routes
  • Assuming Gunicorn is a simpler server than Flask's
2. Which of the following is the correct command to start a Flask app named app inside a module called myapp using Gunicorn?
easy
A. gunicorn myapp:app
B. gunicorn myapp.app
C. gunicorn app.myapp
D. gunicorn app:myapp

Solution

  1. Step 1: Understand Gunicorn command syntax

    The syntax is gunicorn module:app, where module is the Python file or package and app is the Flask app object.
  2. Step 2: Apply syntax to given names

    Given the module is myapp and the app object is app, the correct command is gunicorn myapp:app.
  3. Final Answer:

    gunicorn myapp:app -> Option A
  4. Quick Check:

    Use colon between module and app = B [OK]
Hint: Use colon between module and app name in command [OK]
Common Mistakes:
  • Using dot instead of colon
  • Swapping module and app names
  • Omitting the app object name
3. Given the command gunicorn -w 3 -b 0.0.0.0:8000 myapp:app, what will happen when you run it?
medium
A. Gunicorn will start 3 worker processes and listen on all network interfaces at port 8000
B. Gunicorn will start 1 worker and listen only on localhost at port 8000
C. Gunicorn will start 3 workers but listen only on localhost at default port 5000
D. Gunicorn will fail because the binding address is invalid

Solution

  1. Step 1: Analyze the command options

    The -w 3 option sets 3 workers. The -b 0.0.0.0:8000 binds the server to all interfaces on port 8000.
  2. Step 2: Understand the effect of binding and workers

    Binding to 0.0.0.0 means accessible from any network interface, and 3 workers allow handling multiple requests concurrently.
  3. Final Answer:

    Gunicorn will start 3 worker processes and listen on all network interfaces at port 8000 -> Option A
  4. Quick Check:

    -w sets workers, -b sets bind address = A [OK]
Hint: -w sets workers, -b sets bind address and port [OK]
Common Mistakes:
  • Assuming default port 5000 is used
  • Thinking 0.0.0.0 is invalid
  • Confusing workers with threads
4. You tried to run gunicorn myapp.app but got an error saying module not found. What is the likely cause?
medium
A. The Flask app must be run with flask run only
B. You used a dot instead of a colon between module and app
C. You need to run Gunicorn inside a virtual environment
D. Gunicorn requires the app to be named 'application' not 'app'

Solution

  1. Step 1: Check Gunicorn command syntax

    Gunicorn expects module:app with a colon, not a dot.
  2. Step 2: Identify error cause

    Using a dot like myapp.app makes Gunicorn look for a module named myapp.app, causing module not found error.
  3. Final Answer:

    You used a dot instead of a colon between module and app -> Option B
  4. Quick Check:

    Use colon, not dot, in Gunicorn command [OK]
Hint: Use colon, not dot, between module and app in command [OK]
Common Mistakes:
  • Using dot instead of colon
  • Assuming app name must be 'application'
  • Thinking virtual environment causes this error
5. You want to deploy a Flask app with Gunicorn on a server with 4 CPU cores. Which Gunicorn configuration is best to maximize performance without overloading the server?
hard
A. Run Gunicorn with 8 workers and bind to 0.0.0.0:80
B. Run Gunicorn with 1 worker and bind to 0.0.0.0:5000
C. Run Gunicorn with 2 workers and bind to 0.0.0.0:8080
D. Run Gunicorn with 4 workers and bind to 127.0.0.1:8000 behind a reverse proxy

Solution

  1. Step 1: Match workers to CPU cores

    Best practice is to run Gunicorn with number of workers equal to CPU cores (4 here) for optimal concurrency.
  2. Step 2: Bind to localhost and use reverse proxy

    Binding to 127.0.0.1:8000 and placing a reverse proxy (like Nginx) in front is a common production setup for security and performance.
  3. Final Answer:

    Run Gunicorn with 4 workers and bind to 127.0.0.1:8000 behind a reverse proxy -> Option D
  4. Quick Check:

    Workers = CPU cores, bind localhost + proxy = C [OK]
Hint: Match workers to CPU cores; use localhost bind with reverse proxy [OK]
Common Mistakes:
  • Using too many workers causing overload
  • Binding directly to port 80 without proxy
  • Using too few workers limiting performance
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard