News for hackers. Stuff that matters.
Re:No-GIL mode coming for Python by miraculixx on Saturday July 29, 2023 @05:00AM (#36918310)
Yes, the same is true for free threading. Yet people assume free threading is free concurrency and that's the problem.
Re:No-GIL mode coming for Python by usrbinbash on Saturday July 29, 2023 @12:00PM (#36921508)
Show me someone who actually knows how threads work and what writing threading code entails who assumes that.

I am perfectly aware that threads are not free.

Just as I am perfectly aware that a context switch between threads is less expensive that switching a new process onto the core, and that IPC requires kernel involvement.

Re:No-GIL mode coming for Python by commonlisp94 on Saturday July 29, 2023 @06:15PM (#36925275)
> context switch between threads is less expensive that switching a new process onto the core

But the overhead of a context switch for a thread and process is very similar. The main difference is whether memory is shared by default.

Re:No-GIL mode coming for Python by usrbinbash on Sunday July 30, 2023 @02:55AM (#36928577)
> is very similar.

Except that the threads share the exact same virtual address space, and processes do not, which makes the thread context switch faster.

And that is to say nothing about the setup and teardown process, which for a process involves copy-on-demand'ing the entire memory, but for a thread merely setting up its own stack.

Re:No-GIL mode coming for Python by commonlisp94 on Sunday July 30, 2023 @11:28AM (#36932211)
> Except that the threads share the exact same virtual address space, and processes do not, which makes the thread context switch faster

That's what I said. But it's really not much. I'm afraid we will need numbers now to continue the conversation. If I measured would you be open to changing your opinion? Or are you committed to this topic, so that it would have no bearing?

Re:No-GIL mode coming for Python by kerkeslager on Sunday July 30, 2023 @05:29PM (#36936183)
Well, I don't know how you'd test that, but you should really consider testing the other half of the post you're responding to which you ignored, because that's much easier to test:

Spin up and tear down a million pthreads in C, and see how long that takes and how much memory it takes. Then spin up and tear down a million processes in C and see your computer grind to a halt until you kill the process that is starting the processes, if you can even get your computer to do that without power-cycling.

It's <50 lines of code for each, so I'm eagerly waiting for your response!

Notably, my confidence here comes from the fact that I don't generally get into performance arguments without having actually tested what I'm saying. I've written this code before--it's what I do whenever I'm checking out a new programming language or threading library. Given the complexity of modern computers, nobody really can predict how a program will behave without testing it (except maybe in assembly) there's just too many variables. So you should stop doing that.

If you decide to try the same thing in Java (the other language mentioned), probably drop the number of threads/processes down to 100,000, since Java's lightweight threads aren't quite as efficient. 100,000 processes will probably still be enough to crash your computer.

I'm sure you can find some language/library which implements threads particularly inefficiently, so let's stick to pthreads/C and avoid that straw man.

Re:No-GIL mode coming for Python by commonlisp94 on Monday July 31, 2023 @08:43AM (#36941754)
I just tried your tests on Debian. For some reason the threads one was failing at about 3000 (probably my config), so I bumped it down for both. Here are the results:

    $ gcc threads.c 
    $ time ./a.out 

   real 0m10.097s
   user 0m0.035s
   sys 0m0.239s

    $ gcc process.c 
    $ time ./a.out 
    real 0m10.168s
    user 0m0.579s
    sys  0m0.347s

Were you running on something besides linux, or not natively? Is this something that degrades with the large numbers?

Also, spawning is not context switching. That's the overhead that matters. But according to your own test, spawning in reasonable numbers will be about the same.

Re:No-GIL mode coming for Python by kerkeslager on Monday July 31, 2023 @01:07PM (#36945660)
> Were you running on something besides linux, or not natively?

Running on MacOS, but I've run this in Linux.

> Is this something that degrades with the large numbers?

The concern here is memory--once you push into pagefile your processes will become extremely slow.

> Also, spawning is not context switching.

Thank you obviousman.

> That's the overhead that matters.

Why do you think you know every use case? You don't. There are tons of use cases where having to be concerned about creating and destroying threads places a large burden on the developer.

> But according to your own test, spawning in reasonable numbers will be about the same.

You didn't run my test.

Running 3000 processes is a few orders of magnitude less than running 1000000, and you don't get to determine what "reasonable" is for every application that exists.

Re:No-GIL mode coming for Python by commonlisp94 on Tuesday August 01, 2023 @01:21AM (#36952638)
It's your own test, I don't need see why you need to respond in this manner.

> Running 3000 processes is a few orders of magnitude less than running 1000000

I didn't decide on the limit, my OS did. So they must think it's unreasonable.

> Running on MacOS, but I've run this in Linux.

Well your test works fine on linux. MacOS is not designed to run large multi-process server loads. Linux has specifically optimized forking and context switching for processes.

> Why do you think you know every use case?

Why do you think you can't handle most cases by using processes? The goal isn't for a tool to handle every use case, it's to handle a specified set of use cases well.

Python itself doesn't work for every use case.

Looks like we are safe to ignore overhead of launching processes for programs with fewer than 3000 threads.

> Thank you obviousman.

I wanted to compare context switch, you decided to measure something else. I am pleasantly surprised anyway.

Re:No-GIL mode coming for Python by kerkeslager on Tuesday August 01, 2023 @02:03AM (#36952847)
> I didn't decide on the limit, my OS did. So they must think it's unreasonable.

> Well your test works fine on linux. MacOS is not designed to run large multi-process server loads. Linux has specifically optimized forking and context switching for processes.

Oh JFC, stop wildly speculating and pretending it's the truth. The test was a million threads/processes, and you ran 3000. By your own description you didn't run the test, period. I just ran it on Debian on a VPS and, you know, it did exactly what I said it was going to do, because gosh, this isn't the first time I've run this test on Linux.

And you seriously want to attribute this to Linux having optimized forking and context switching as if you have any idea what that means? Please do tell, which optimizations did they apply that somehow they've hidden from BSD and Apple?

Given your propensity to make things up when you don't know something, I'm beginning to think whatever problem you ran into with a million threads was fixable and you just didn't know how to, so you made up a new straw man test to try and win an argument. Have you measured the memory usage at 3000 yet, or are you still ignoring any part of reality that isn't convenient for your argument?

> Why do you think you can't handle most cases by using processes?

Where did I say that? Unlike you, I don't make generalizations about "most use cases" because I don't pretend to know what everyone in the world is doing.

> The goal isn't for a tool to handle every use case, it's to handle a specified set of use cases well.

What do you mean, "the goal"? You speak for every possible goal anyone using Python could possibly have now?

> I wanted to compare context switch, you decided to measure something else.

Then do it! I'd be interested to see the results, and even more interested to see how you tested it.

In any case, you can't just ignore tests you don't want to do or apparently aren't capable of. Being able to run a lot of threads can be extremely useful for networking applications, which is why I care. You don't get to decide my use case is "unreasonable" because you apparently can't compile a program that does a stripped down version of it.

That is to say, even if context switching is faster in processes than in threads, that doesn't mean there's no use to threads, because there are use cases where spinning up and tearing down is more common than context switching.

> I am pleasantly surprised anyway.

Ignorance is bliss, I suppose.

Re:No-GIL mode coming for Python by kerkeslager on Tuesday August 01, 2023 @11:04AM (#36956898)
I'm just now noticing this, from your test:

   $ gcc threads.c 
   $ time ./a.out 

   real 0m10.097s
   user 0m0.035s
   sys 0m0.239s

   $ gcc process.c 
   $ time ./a.out

   real 0m10.168s
   user 0m0.579s
   sys  0m0.347s
You were pleasantly surprised by your own test showing an order of magnitude speed gain in user space by using threads?