16

I started studying python a couple of month ago, then I found Jython.

Do threads work properly in Jython, since it doesn't have a GIL? If so, can you suggest a good book on concurrency (threading)?

4

4 回答 4

7

我遇到的关于多线程的最好的书是《Java Concurrency in Practice》。它非常专注于 Java 线程并发,当您开始了解并发带来的问题和可能性时,它既令人谦卑又令人兴奋。然而,我几年前购买的副本在编码中有一些勘误,这加剧了一个已经具有挑战性的主题:在此处查看勘误:http: //jcip.net/errata.html

虽然是为希望尝试并发性的 Java 开发人员设计的(顺便说一下,其中包括曾经使用过任何类型 GUI 界面的任何人),但我确信本书中概述的技术困难和微妙之处适用于任何并发实现。

顺便说一句,我也喜欢 Jython,并且可以确认任何可以在 Java 中执行的并发方面的事情,显然都可以在 Jython 中执行。但是,有一个警告:并发可以用于异步编程(包括 GUI)和/或性能。如果对于后者您有问题,我认为:根据我的经验,Jython 的运行速度比等效的 Java 程序慢大约 10 倍。

这意味着您要求更高的 Jython 模块将不得不调用除 Jython 之外的其他东西来执行数字运算任务。同时,到目前为止,Jython* 还没有 Python 的多处理模块,因此进程间通信已被淘汰,除非您冒险进入可怕的 RMI 领域。如果你选择那个选项,你比我更像一个男人/女人。但一切都还好:请参阅http://www.jython.org上的“The Definitive Guide to Jython” ……第 19 章是对并发性的介绍,第 10 章是关于 Java 和 Jython 的集成(提示:这非常容易)。

  • 有趣:对 Jython 站点的快速浏览显示,就在 10 天前,即 2012 年 5 月 17 日,发布了 2.7a1 版本……“Alpha”版本。这应该包含 Python 2.6 附带的多处理模块。检查一下会很有趣:如果是这样,它可能为您提供了链接 Jython 和 CPython 进程的令人兴奋的选项(稍后更新:遗憾的是,目前看来并非如此 - 模块名称“multiprocessing”在我尝试时未被识别)...

PS 最后一句话:大多数专家对这些事情的了解远多于我所说的摩尔定律的重要性正在被阿姆达尔定律所取代,简而言之,这意味着编写稳定且可扩展的真正并发程序的艰巨挑战将是不可避免的未来。使用聪明的代码分析工具可以让真正的(即线程)并发变得多么容易,我不能说,但是对这个主题的投资以及并发强加的迷人的、智力的新推理学科可能会得到回报……如果你喜欢挑战。

于 2012-05-27T10:46:29.047 回答
3

是的,有了 Jython,您就拥有了真正的多线程。Jython(JPython 的继任者)是在 JVM 中运行的 Python 实现。Jython 和原始项目之间的主要区别之一是第一个项目没有 GIL,而是基于 JVM 的实现实现了真正的多线程支持。

我建议你看看这本书OReilly 的书 。

于 2012-05-15T07:28:27.307 回答
1

我已经用一个例子试过了。

要求:
from rough import print_time
from datetime import datetime

"""
This is actually using python threading package.
One thing I came to know is that if we use the python threading module also, 
internally Jython chnages it to Java thread and work.
"""
# from threading import Thread, InterruptedException

"""
This is the java threading module.
"""
from java.lang import Thread, InterruptedException


"""
Here you can call your module from the run method.
For passing arguments, you can use the constructor of the Cycle class.
"""
class Cycle(Thread):

    def __init__(self,time1=1):
        Thread.__init__(self)
        # arguments for the run method
        self.time1 = time1

    def run(self):
        try:
            # Calling the required module with given arguments
            print_time(self.time1)
        except InterruptedException:
            print("Exception")

if __name__ == '__main__':
    print("start time:",datetime.now())
  
    for i in range(100):
        Cycle(i).start()
        
    print("end time:",datetime.now())

请在https://github.com/om12nayak/Jython_multithreading_demo中找到完整代码

于 2020-12-18T07:07:26.100 回答
0

最初令人困惑的方面可能是您可以混合和匹配Java 和 Jython 的并发机制。但这一切似乎都奏效了。原因是:

  • 在 Jython 之下是相同的旧 Java。即使在沉重的 Jython 机器下,它所有强大的线程机制和数据结构也不会崩溃。
  • Jython 的线程以 Java 线程为底盘,并添加了一些上层结构,使它们能够使用 Python 线程 API。(没有更好的方法可以更轻松地移植线程化的 Python 代码。)但是这两种线程的本质是相似的。除了 Jython 线程

    ...没有优先级,没有线程组,线程不能被销毁、停止、挂起、恢复或中断。[1]

Python 惯用语可能更方便一些,因为例如,如果您希望做 的等价物synchronized (some_object) { ... },则需要进行一些摆弄,这可能比使用RLock可读性差。

于 2016-02-12T08:25:45.753 回答