문제

From python threading documentation

In CPython, due to the Global Interpreter Lock, only one thread can execute Python code at once (even though certain performance-oriented libraries might overcome this limitation). If you want your application to make better use of the computational resources of multi-core machines, you are advised to use multiprocessing. However, threading is still an appropriate model if you want to run multiple I/O-bound tasks simultaneously.

Now I have a thread worker like this

def worker(queue):
    queue_full = True
    while queue_full:
        try:
            url = queue.get(False)
            w = Wappalyzer(url)
            w.analyze()
            queue.task_done()

        except Queue.Empty:
            queue_full = False

Here w.analyze() doing two things

  1. Scrape the url using requests library
  2. Analyzing the scraped html using pyv8 javascript library

As far as I know, 1 is I/O bound and 2 is CPU bound.

Does that mean, GIL applied for 2 and my program won't work properly?

도움이 되었습니까?

해결책

The GIL description does not say anything about correctness, only about efficiency.

If 2 is CPU bound, you will not be able to get multicore performance out of threading, but your program will still perform correctly.

If you care about CPU Parallelism, you should use Python's multiprocessing library.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top